2013-10-10 36 views
3

在我的ASP.NET MVC控制器中,我想調用基於服務堆棧的服務(不在MVC站點中託管)。爲了使代碼可測試,我想將這個服務客戶端注入到控制器的構造函數中。可以在多線程應用程序(MVC)中使用ServiceClient的一個實例

假設我有自己的繼承自JsonServiceClient的類,那麼對於所有的MVC調用,我可以使用該服務客戶端的單例嗎?這意味着客戶端必須是線程安全的。

要麼(Autofac)註冊可以是個單:

builder.RegisterType<SomeServiceClient>().SingleInstance(); 

或它必須是每http請求:

builder.RegisterType<SomeServiceClient>().InstancePerHttpRequest(); 

實測其中另一個servicestack用戶似乎使用了博客文章單身人士,但我不確定:Blog Article Showing an Example

回答

1

每個請求通常是可重入的,所以它主要是ThreadSafe作爲單例使用,一個警告是它shar同一個CookieContainer,雖然ServiceClients不改變CookieContainer集合本身,但底層的WebRequest會不知道WebRequest是否同步它的訪問 - 雖然我從來沒有親自看到任何問題。

您可以禁用使用的Cookie(即,如果您的客戶端不需要會話)與:如果使用相同的服務客戶端異步調用

client.StoreCookies = false; 
+4

,這可能會帶來問題。最終會出現System.InvalidOperationException:在前一個調用仍在進行時,無法重新調用BeginGetRequestStream/BeginGetResponse。 在System.Net.HttpWebRequest.BeginGetResponse(AsyncCallback的回調,對象狀態) 在ServiceStack.ServiceClient.Web.AsyncServiceClient.SendWebRequestAsync [τ響應](字符串列舉HTTPMethod,對象請求,RequestState'1 requestState,HttpWebRequest的的WebRequest) –

+0

@WayneBrantley你有一個repro的例子嗎?因爲每個請求都會創建一個新的HttpWebRequest。 – mythz

+0

在AppHost.Configure中,我註冊了一個自JsonServiceClient後繼的自定義類的實例。這個調用只需要幫助器方法並添加一個RequestFilter來添加一個請求頭。然後我從我的Web應用程序中使用同一個實例。這導致上面的錯誤,所以我改變了註冊有一個lambda和'ReuseScope.None'。這個問題再也沒有出現,所以我繼續前進。這是服務棧3.x –

相關問題