Получение текущего OwinContext без использования HttpContext

С

HttpContext.Current.GetOwinContext()

Я могу получить текущий OwinContext в веб-приложениях.

С OwinContext.Set<T> и OwinContext.Get<T> Я сохраняю значения, которые должны присутствовать для всего запроса.

Теперь у меня есть компонент, который должен использоваться внутри веб-приложений и консольных приложений owin. В этом компоненте я в настоящее время не имею доступа к http-контексту.

В приложении я использую функции threading и async.

Я также попытался использовать CallContext, но это, похоже, потеряло данные в somescenarios.

Итак, как я могу получить доступ к текущему OwinContext? Или есть другой контекст, где я могу играть мои ценности?

Ответ 1

Я делаю ниже с помощью WebApi AuthorizationFilter, также вы также можете это сделать на контроллере MVC и в контексте контроллера WebApi, если у вас есть промежуточное программное обеспечение для его поддержки, например app.UseWebApi(приложение) для WebApi.

Компонент должен поддерживать конвейер Owin, иначе не уверен, как вы получите контекст для правильного потока.

Итак, возможно, вы можете создать свой собственный

OwinMiddleware

чтобы подключить этот компонент с помощью app.Use() в вашем запуске Owin.

Подробнее здесь

Мои свойства Middleware

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 StartUp

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"];
}

Счастливое кодирование!