2014-10-05 72 views
12

我需要運行我的應用程序,它在IIS和.NET CLR自主模式下都提供了一些ASP.NET Web API服務。 我開發了基於OWIN的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自主主機模式下執行什麼操作?

回答

2

首先,我要糾正我的問題。

HttpContext.Current在基於ASP.NET和集成IIS管道的應用程序中可用。但是,即使在IIS集成管道上,我們也無法在任何地方不使用此類。

答:

1 - 你需要的地方IOwinContext,你得到它,使用依賴注入,例如通過構造函數注入。

2-配置一切工作基於歐文,SignalR是唯一的基於Owin,但一起使用Web API API,並使用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。網絡),Owin SelfHost甚至Owin Test Server。

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

+0

嗨!我還需要訪問IOwinContext以用於自行託管的SignalR集線器...您能否顯示您使用過的代碼?在閱讀這兩個答案後,我仍然不知道該怎麼做......'Request'是'System.Web.Mvc.Controller'的一個屬性,我無法從我的中心使用:( – ibiza 2016-08-06 20:16:09

+0

「Autofac.Owin 「使用Owin中間件開始依賴注入,它將繼續將包括IOwinContext在內的所有請求對象傳遞給其他中間件,如Web API和SignalR以及其他中間件,包括由您開發的中間件,但ASP.NET MVC不是與owin兼容的中間件,你不能自己託管ASP.NET MVC,我很困惑你的問題/ - : – 2016-08-07 17:59:29

+0

好的,Autofac是用於模擬和測試,我不是在這種情況下,我希望你會用一些代碼更新你的答案,無論如何 – ibiza 2016-08-07 18:00:53

15

您可以使用Request.GetOwinContext()進行網絡託管和自託管。 GetOwinContextHttpRequestMessage的擴展方法,在System.Web.Http.Owin.dll程序集中定義。

UPDATE

我已經回答了你原來的問題,這就是如何讓OWIN上下文兩個Web託管和自我託管。現在,通過評論中的附加問題,您已經顯着拓寬了問題的範圍。儘管有一個基本問題。 IOwinContext不是OWIN的東西,它是一個武士刀的事情。您不能指望任何託管在OWIN上的框架以IOwinContext的形式提供上下文。 ASP.NET Web API並不是每個框架都應該這樣做。 IOwinContext是對OWIN環境字典的抽象,並且該字典將可用於任何OWIN中間件。但是,通過在框架之上工作,您不再可以直接訪問OWIN環境,而只能通過特定框架決定公開上下文的方式。

對於南希,您必須使用NancyContext才能進入Items字典,並查找與「OWIN_REQUEST_ENVIRONMENT」鍵相對應的值。對於SignalR,Environment財產IRequest可讓您訪問OWIN環境。一旦擁有OWIN環境,您就可以使用該環境創建一個新的OwinContext

+2

是的,你說得對,但信號r呢?南希等?我需要全局的東西來處理已經託管在owin上的所有框架。 – 2014-10-06 14:21:04

+0

你說的是對的,但我找到了一個設計良好的統一解決方案。 – 2016-02-06 14:41:07