gpt4 book ai didi

c# - 不使用 HttpContext 获取当前 OwinContext

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

HttpContext.Current.GetOwinContext()

我可以在 Web 应用程序中接收当前的 OwinContext。

OwinContext.Set<T>OwinContext.Get<T>我存储应该出现在整个请求中的值。

现在我有一个组件应该在 web 和控制台 owin 应用程序中使用。在此组件中,我目前无权访问 http 上下文。

在应用程序中,我使用线程和异步功能。

我还尝试使用 CallContext但这在某些情况下似乎会丢失数据。

如何访问当前的 OwinContext?还是有其他环境可以让我发挥我的值(value)观?

最佳答案

我使用 WebApi AuthorizationFilter 执行以下操作,如果您有中间件支持它,例如 app.UseWebApi(app) for WebApi,您也应该能够在 MVC Controller 和 WebApi Controller 上下文上执行此操作。

组件必须支持 Owin 管道,否则不确定如何从正确线程获取上下文。

所以也许你可以创建自己的自定义

OwinMiddleware

在您的 Owin 启动中使用 app.Use() 连接此组件。

更多信息 here

我的属性中间件

public class PropertiesMiddleware : OwinMiddleware
{
Dictionary<string, object> _properties = null;

public PropertiesMiddleware(OwinMiddleware next, Dictionary<string, object> properties)
: base(next)
{
_properties = properties;
}

public async override Task Invoke(IOwinContext context)
{
if (_properties != null)
{
foreach (var prop in _properties)
if (context.Get<object>(prop.Key) == null)
{
context.Set<object>(prop.Key, prop.Value);
}
}

await Next.Invoke(context);
}
}

Owin 启动配置

public void Configuration(IAppBuilder app)
{

var properties = new Dictionary<string, object>();
properties.Add("AppName", AppName);

//pass any properties through the Owin context Environment
app.Use(typeof(PropertiesMiddleware), new object[] { properties });
}

WebApi 过滤器

public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext context, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{

var owinContext = context.Request.GetOwinContext();
var owinEnvVars = owinContext.Environment;
var appName = owinEnvVars["AppName"];
}

编码愉快!

关于c# - 不使用 HttpContext 获取当前 OwinContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25762001/

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