20

我需要一种方法来存储每个请求的日志记录对象。使用 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 时,我应该如何存储每个请求的数据让我相信请求对象上的属性集合是可行的方法。如何从中间件访问此对象?

4

1 回答 1

19

OWIN 环境字典可用于存储每个请求的数据。请求对象的属性集合可以用来做同样的事情。

主要区别在于 OWIN 环境字典是一个 OWIN 概念,适用于在 OWIN 主机中运行的任何中间件。请求对象的属性集合是一个 ASP.NET Web API 概念,仅适用于该特定框架。

顺便说一句,ASP.NET Web API 本身作为 OWIN 管道中的中间件运行。因此,要回答您的问题,您不能从中间件访问 Web API 的请求属性集合,因为它仅适用于 Web API 中间件(或该特定框架)。

如果你想把你的横切关注点写成 OWIN 中间件,你必须使用 OWIN 环境字典。如果过滤器或消息处理程序等 Web API 扩展点没问题,那么您可以使用属性集合。

显然,您利用 Web API 扩展点编写的任何内容都仅适用于 Web API,而 OWIN 中间件适用于在 OWIN 管道中运行的任何类型的应用程序,包括 Web API。

于 2014-12-09T13:58:15.747 回答