Получить текущий контекст 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?
Ответы
Ответ 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
с помощью среды.