我需要一种方法来存储每个请求的日志记录对象。使用 HttpContext 我会将其添加到项目字典中。如果我能提供帮助,我不想将 HttpContext 带入其中。下面的代码是我为 Unity LifeTimeManager 提出的,它将对象存储在 OwinContext 的 Environment 属性中,我可以使用我的 Owin 中间件访问该属性。
public class OwinContextLifetimeManager : LifetimeManager
{
private string key = (new Guid()).ToString();
private IDictionary<string, object> environment;
public OwinContextLifetimeManager(IDictionary<string, object> environment)
{
this.environment = environment;
}
public override object GetValue()
{
if (environment != null && environment.ContainsKey(key))
return environment[key];
else
return null;
}
public override void RemoveValue()
{
if (environment != null)
environment.Remove(key);
}
public override void SetValue(object newValue)
{
if (environment != null)
environment[key] = newValue;
}
}
然后我可以从我的中间件中像这样使用它:
container.RegisterType<IRequestLog, RequestLog>(new OwinContextLifetimeManager(environment));
我突然想到,我可以选择任何我想要的键,除了那些已经被 Owin 保留的键。有什么理由我不应该为此目的使用 OwinContext.Environment 吗?MSDN 文档对此的最佳实践含糊不清。
Darrel Miller 在这里的回应:当使用 OWIN 来自托管 ASP.NET Web API 时,我应该如何存储每个请求的数据让我相信请求对象上的属性集合是可行的方法。如何从中间件访问此对象?