在自主機模式下獲取目前的 owin 上下文
我需要執行我的應用程序,它在 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使用該環境創建新環境。