2013-10-10 38 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 –

相关问题