gpt4 book ai didi

c# - 我应该使用 OwinContext 的环境来保存每个请求的应用程序特定数据吗

转载 作者:可可西里 更新时间:2023-11-01 03:01:04 24 4
gpt4 key购买 nike

我需要一种方法来为每个请求存储一个日志记录对象。使用 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));

我突然想到,我可以选择任何我想要的 key ,除了那些已经被 Owin 保留的 key 。有什么理由我不应该为此目的使用 OwinContext.Environment 吗? MSDN 文档对此的最佳实践含糊不清。

Darrel Miller 在这里的回复:How should I store per request data when using OWIN to Self-Host ASP.NET Web API让我相信请求对象上的属性集合是可行的方法。我怎样才能从中间件访问这个对象?

最佳答案

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。

关于c# - 我应该使用 OwinContext 的环境来保存每个请求的应用程序特定数据吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27368130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com