我可以访问 OWIN 环境词典吗?

Can I access the OWIN environment dictionary?

我可以在 ASP.NET Core 中访问 OWIN 环境字典吗?

我想从 Startup.cs 文件访问它。

我想要访问它的原因是因为我想将 OWIN 环境字典传递给我的中间件或从我的中间件中访问它。

我开始相信 OWIN 环境只能通过安装包 Microsoft.AspNetCore.Owin 来使用,该包将 UseOwin 扩展方法暴露给 IApplicationBuilder class。

那么它只能在 Startup.cs 中从 Configure 方法作为参数传递给您的方法 app.UseOwin

我在 ControllerControllerBaseHttpContextControllerContext 中的任何地方都找不到 OWIN 环境字典。 HttpContext 虽然有 Items 字典。

您可以使用在 HttpContext 中找到的数据,自己手动构建自己的 OWIN 环境。但只能从内部 app.UseOwin.

https://docs.asp.net/en/latest/fundamentals/owin.html#owin-keys

ASP.NET Core 中带有附加 AspNetCore.Owin 包的现有 OWIN 环境如下所示:

[owin.RequestProtocol, HTTP/1.1]
[owin.RequestScheme, http]
[owin.RequestMethod, GET]
[owin.RequestPathBase, ]
[owin.RequestPath, /]
[owin.RequestQueryString, ]
[owin.RequestHeaders, Microsoft.AspNetCore.Owin.DictionaryStringArrayWrapper]
[owin.RequestBody, Microsoft.AspNetCore.Server.Kestrel.Internal.Http.FrameRequestStream]
[owin.RequestUser, ]
[owin.ResponseStatusCode, 200]
[owin.ResponseReasonPhrase, ]
[owin.ResponseHeaders, Microsoft.AspNetCore.Owin.DictionaryStringArrayWrapper]
[owin.ResponseBody, Microsoft.VisualStudio.Web.BrowserLink.Runtime.ScriptInjectionFilterStream]
[server.OnSendingHeaders, System.Action`2[System.Action`1[System.Object],System.Object]]
[server.ConnectionId, 0HKV72R0U3SDL]
[server.LocalPort, 27417]
[server.RemotePort, 56374]
[server.LocalIpAddress, 127.0.0.1]
[server.RemoteIpAddress, ::1]
[server.User, ]
[owin.CallCancelled, System.Threading.CancellationToken]
[owin.Version, 1.0]
[Microsoft.AspNetCore.Http.HttpContext, Microsoft.AspNetCore.Http.DefaultHttpContext]

积分:

  • OWIN 不是 ASP.NET 核心的一部分。
  • ASP.NET 核心 MVC 不是构建在 OWIN 之上。
  • 可以使用 AspNetCore.Owin 包将对 OWIN 的支持添加到 ASP.NET 核心。

是的,你可以!

首先安装 Microsoft.AspNetCore.Owin 包。

然后从任何地方得到 HttpContext 的实例,您可以创建 OwinEnvironment class 的实例,并将 HttpContext 作为构造函数的参数。

var environment = new OwinEnvironment(HttpContext);

这没有任何索引器,所以你不能做 environment["owin.RequestProtocol"],但你可以做:

var requestProtocol = environment.Single(x => x.Key == Owin.RequestProtocol");

但是,您可以通过 .ToDictionary 将其变成字典:

var dictionary = environment.ToDictionary(x => x.Key, x => x.Value);

现在它有一个索引器,您可以参考 environment["owin.RequestProtocol"] 之类的键来获取值。

还有一个 OwinFeatureCollection class,你可以将环境输入到字典中。

var environment = new OwinEnvironment(HttpContext);
var features = new OwinFeatureCollection(environment);
var requestProtocol = features["owin.RequestProtocol"];

但是,Microsoft.AspNetCore.Owin 中不再有用于强类型访问器的 OWinContext,它位于不同包中的 Microsoft.Owin 命名空间中。