Подтвердить что ты не робот

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

Мне нужно запустить мое приложение, которое предоставляет некоторые службы веб-API ASP.NET как в режимах IIS, так и в .NET CLR. Я разработал службы ASP.NET Web API на основе 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;
                }
            }
        }
    }

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

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

4b9b3361

Ответ 1

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

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

Ответ:

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

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

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

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

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

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

Ответ 2

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

ОБНОВЛЕНИЕ

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

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