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

С участием

HttpContext.Current.GetOwinContext()

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

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

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

В приложении я использую функции потоковой передачи и асинхронности.

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

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


person Boas Enkler    schedule 10.09.2014    source источник


Ответы (1)


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

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

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

OwinMiddleware

для подключения этого компонента с помощью app.Use () при запуске Owin.

Дополнительная информация здесь

Промежуточное ПО "Мои свойства"

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

Удачного кодирования!

person dynamiclynk    schedule 26.02.2015