我是否应该使用 OwinContext 的环境来保存每个请求的应用程序特定数据

本文关键字:请求 应用程序 数据 保存 环境 是否 OwinContext | 更新日期: 2023-09-27 18:33:46

>我需要一种方法来存储每个请求的日志记录对象。使用HttpContext,我会将其添加到项目字典中。如果我能帮助它,我不想将HttpContext带入其中。下面的代码是我为Unity LifeTimeManager建议的代码,它将对象存储在OwinContext的环境属性中,我可以使用我的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 自承载 Web API 时,我应该如何存储每个请求的数据 ASP.NET 这让我相信请求对象上的属性集合是要走的路。如何从中间件访问此对象?

我是否应该使用 OwinContext 的环境来保存每个请求的应用程序特定数据

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。

相关文章: