Asp.net

在自主機模式下獲取目前的 owin 上下文

  • February 6, 2016

我需要執行我的應用程序,它在 IIS 和 .NET CLR 自託管模式下都提供了一些 ASP.NET Web API 服務。我基於 OWIN 開發了我的 ASP.NET Web API 服務,它在兩台主機上都執行良好。現在我需要這樣的東西:

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 Self Host 模式下我應該怎麼做?

首先,我必須糾正我的問題。

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 控制器、信號器集線器和 owin 中間件,它會使用建構子注入將 IOwinContext 實例傳遞給您想要的類。

我的測試在 Owin IIS/Helios(沒有 asp.net)、Owin SelfHost 甚至 Owin Test Server 上都可以。

這種方法類似於 asp.net vNext。當它準備好生產時,您可以輕鬆地將您的應用程序遷移到 asp.net vNext。

您可以Request.GetOwinContext()用於網路託管和自託管。GetOwinContext是 System.Web.Http.Owin.dll 程序集的擴展方法HttpRequestMessage並在其中定義。

更新

我已經回答了您最初的問題,即如何在網路託管和自託管中獲取 OWIN 上下文。現在,通過您在評論中的附加問題,您已經大大拓寬了您的問題範圍。但是有一個根本問題。IOwinContext不是 OWIN 的東西,而是 Katana 的東西。您不能期望 OWIN 上託管的任何框架都以IOwinContext. ASP.NET Web API 可以,但不是每個框架都應該這樣做。IOwinContext是對 OWIN 環境字典的抽象,該字典可用於任何 OWIN 中間件。但是,通過在框架之上工作,您不再可以直接訪問 OWIN 環境,而只能通過該特定框架決定公開上下文的方式來訪問。

對於 Nancy,您必須使用NancyContext進入Items字典並查找與鍵“OWIN_REQUEST_ENVIRONMENT”對應的值。對於 SignalR,Environment屬性IRequest使您可以訪問 OWIN 環境。擁有 OWIN 環境後,您可以OwinContext使用該環境創建新環境。

引用自:https://stackoverflow.com/questions/26201032