Получить текущий контекст в режиме собственного хоста

Мне нужно запустить мое приложение, которое предоставляет некоторые службы веб-API ASP.NET как в режимах собственного хоста IIS, так и в .NET CLR. Я разработал свои службы веб-API ASP.NET на основе OWIN, и они отлично работают на обоих хостах. Пока мне нужно что-то вроде этого:

public class OwinContextInfrastructure
    {
        public static IOwinContext Current
        {
            get
            {
                if (HttpContext.Current != null)
                {
                    return HttpContext.Current.GetOwinContext();
                }
                else
                {
                    // What should I do here ?
                    return null;
                }
            }
        }
    }

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

Мой код отлично работает в IIS, но что мне делать в режиме .NET Self Host?


person Yaser Moradi    schedule 05.10.2014    source источник


Ответы (2)


Вы можете использовать Request.GetOwinContext() как для веб-хостинга, так и для самостоятельного хостинга. GetOwinContext — это метод расширения для HttpRequestMessage, определенный в сборке System.Web.Http.Owin.dll.

ОБНОВИТЬ

Я ответил на ваш первоначальный вопрос о том, как получить контекст OWIN как на веб-хостинге, так и на собственном хостинге. Теперь, благодаря вашему дополнительному вопросу в комментарии, вы значительно расширили сферу своего вопроса. Однако есть фундаментальная проблема. IOwinContext это не вещь OWIN, это вещь Katana. Вы не можете ожидать, что какая-либо платформа, размещенная на OWIN, предоставит контекст в форме IOwinContext. Веб-API ASP.NET работает, но не каждая платформа должна. IOwinContext — это абстракция словаря среды OWIN, и этот словарь будет доступен любому промежуточному ПО OWIN. Однако, работая поверх платформы, вы больше не можете получить доступ к среде OWIN напрямую, а только через то, как эта конкретная платформа решила раскрыть контекст.

Для Нэнси вы должны использовать NancyContext, чтобы добраться до словаря Items и найти значение, соответствующее ключу "OWIN_REQUEST_ENVIRONMENT". Для SignalR свойство Environment элемента IRequest дает вам доступ к среде OWIN. Получив среду OWIN, вы можете создать новый OwinContext, используя среду.

person Badri    schedule 06.10.2014
comment
Да, вы правы, но как насчет сигнала r? Нэнси и так далее? Мне нужно что-то глобальное для всех фреймворков, которые уже размещены на owin. - person Yaser Moradi; 06.10.2014
comment
То, что вы сказали правильно, но я нашел хорошо разработанное унифицированное решение. - person Yaser Moradi; 06.02.2016

Во-первых, я должен исправить свой вопрос.

HttpContext.Current доступен в приложениях, основанных на ASP.NET и интегрированном конвейере IIS. Но мы не можем использовать этот класс без asp.net где угодно, даже на интегрированном конвейере IIS.

Отвечать:

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

2- Настройте все для работы на основе Owin, SignalR основан только на Owin, но используйте вместе Web Api и owin и используйте nancy для просмотра на стороне сервера, если таковые имеются. Вместо написания обработчиков и модулей IIS или ASP.NET разработайте собственное промежуточное ПО.

3- Используя Autofac.Owin и AutoFac.WebApi, AutoFac.WebApi.Owin и Autofac.SignalR, вы можете настроить внедрение зависимостей для всех промежуточных программ owin, которые есть в вашем приложении.

4- Autofac создаст экземпляры контроллеров веб-API, концентраторов сигналов и промежуточного программного обеспечения OWIN, а также передаст экземпляр IOwinContext в классы, которые вы хотите использовать, используя внедрение конструктора.

Мои тесты проходят нормально на Owin IIS/Helios (без asp.net), Owin SelfHost и даже Owin Test Server.

Этот подход аналогичен asp.net vNext. Вы можете легко перенести свое приложение на asp.net vNext, когда оно будет готово к работе.

person Yaser Moradi    schedule 06.02.2016
comment
Привет! Мне также нужен доступ к IOwinContext для собственного концентратора SignalR... можете ли вы показать код, который вы использовали, который работал, пожалуйста? Прочитав оба ответа здесь, я все еще не уверен, как это сделать... Request - это свойство System.Web.Mvc.Controller, которое я не могу использовать из своего концентратора :( - person Bruno; 06.08.2016
comment
Autofac.Owin запускает внедрение зависимостей с помощью ПО промежуточного слоя Owin, он будет продолжать передавать все объекты запроса, включая IOwinContext, другим ПО промежуточного слоя, таким как Web API и SignalR, и другим ПО промежуточного слоя, включая те, которые разработаны вами, но ASP.NET MVC не является OWIN. совместимое промежуточное ПО, вы не можете самостоятельно размещать ASP.NET MVC, меня смущает ваш вопрос /-: - person Yaser Moradi; 07.08.2016
comment
Хорошо, Autofac предназначен для насмешек и тестирования, я не в этом контексте. Я надеялся, что вы обновите свой ответ каким-нибудь кодом, все равно спасибо - person Bruno; 07.08.2016
comment
Autofac — это библиотека внедрения зависимостей, внедрение зависимостей полезно в самых разных сценариях, включая, помимо прочего, имитации и тестирование. - person Yaser Moradi; 07.08.2016
comment
о, ладно, извините, я думал, что это похоже на RhinoMock и тому подобное, в любом случае, какой-то код явно будет полезнее, чем комментарии :) ура - person Bruno; 07.08.2016
comment
НП (: , скажите, что именно вы хотите, я пытаюсь вам как-то помочь. - person Yaser Moradi; 07.08.2016
comment
На самом деле я только что вспомнил, что нашел ответ на свой первоначальный вопрос (stackoverflow.com/questions/38808214/). Однако я решил переключиться с собственного размещения на размещение в веб-приложении MVC из-за ограничений аутентификации. - person Bruno; 07.08.2016
comment
Как вы регистрируете IOwinContext в своем контейнере? - person ulu; 10.08.2017
comment
У @ulu Autofac-owin есть промежуточное программное обеспечение для этого. Он создает область Autofac для каждого запроса Owin и регистрирует IOwinContext для этой области. Вы можете получить доступ к IOwinContext, используя внедрение зависимостей в классы, которые зарегистрированы в режиме PerScope (это не работает с одноэлементными регистрациями). Bit framework (полный стек для разработки API/мобильных/веб-приложений) является хорошим примером этого настраивает Owin поверх ядра asp.net и расширяет внедрение зависимостей на все основные компоненты owin/asp.net. docs.bit-framework.com - person Yaser Moradi; 11.08.2017