- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我需要一种方法来为每个请求存储一个日志记录对象。使用 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/
理论上,OwinContext 环境应该可以访问请求/响应信息以及服务器变量,但由于某些原因,我无法访问来自 Request.ServerVariables 的一些自定义服务器变量。收藏。 是什么导致
我需要在运行时更改 dbContext对于 Request.GetOwinContext()使用特定的 connectionString但它不起作用。 我有一个 dbContex class接受默认
我需要一种方法来为每个请求存储一个日志记录对象。使用 HttpContext 我会将其添加到项目字典中。如果可以的话,我不想将 HttpContext 引入其中。下面的代码是我为 Unity Life
我正在使用 ASP.NET Identity、OwinContext 和 EF 6 将包含所有必需用户的 excel 文件上传到我的网站。我的代码如下所示: foreach (var bulkUser
我正在尝试对一种方法进行单元测试,该方法检查 OwinContext.Request.Query 中的查询并更改它 public static async Task SetUpQuery(IOwinC
我使用声明进行身份验证并基于此文档 auth user我可以使用 OwinContext 登录。但是,与 SecurityManager.Authenticate 不同,OwinContext 不会返
我有一个使用 Nancy 的自托管 Owin 应用程序。在其中一个 NancyModules 中,我需要获取 IOwinContext 的实例。 这个问题涉及主题,但没有解决方案:Get curren
与 HttpContext.Current.GetOwinContext() 我可以在 Web 应用程序中接收当前的 OwinContext。 与 OwinContext.Set和 OwinConte
我有一个使用 Microsoft Identity 2.0 和 Unity.Mvc 进行依赖注入(inject)的 ASP.NET Web 应用程序。 Microsoft Identity 2.0 在
我正在尝试设置我的依赖注入(inject),我需要将 IAuthenticationManager 从 ASP.NET Identity 注入(inject)到 OwinContext。 为此,我从我
基于 Katana 项目中的其他示例,我正在为 OpenID Connect 授权代码流编写自己的 OWIN 中间件。 作为其中的一部分,我必须构建几个 URI,例如一个重定向 URI 和一个返回 U
我正在按照 Microsoft 示例使用 Identity 2.0.0 实现电子邮件验证 我卡在这部分了 public ApplicationUserManager UserManager {
当用户访问网站并输入存储在我们数据库中的凭据时,我们会创建身份验证。 如何设置超时时间?使用 MVC 5。 我的身份验证如下所示: var claims = new List();
我有一个简单的模型 Binder : public class PersonBinder : IModelBinder { public object BindModel(Controller
我希望在所有应用程序请求之间共享特定的静态数据(尤其是站点菜单 DTO)。在过去的 system.web.dll 时代,这会将 Application_Start 中的数据添加到 HttpConten
我是一名优秀的程序员,十分优秀!