【问题标题】:Can one instance of a ServiceClient be used in multiple threaded application (MVC)ServiceClient 的一个实例可以在多线程应用程序 (MVC) 中使用吗
【发布时间】:2013-10-10 13:43:14
【问题描述】:

在我的 ASP.NET MVC 控制器中,我想调用基于 servicestack 的服务(不在 MVC 站点中托管)。为了使代码可测试,我想将此服务客户端注入到控制器构造函数中。

假设我有自己的继承自 JsonServiceClient 的类,我可以为所有 MVC 调用使用该服务客户端的单例吗?这意味着客户端必须是线程安全的。

(Autofac)注册可以是单例:

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

或者它必须是每个 http 请求:

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

发现了一篇博客文章,其中另一个 servicestack 用户似乎使用了单例,但我不确定:Blog Article Showing an Example

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    每个请求通常都是可重入的,因此它主要是 ThreadSafe 用作 Singleton,需要注意的是它共享相同的 CookieContainer,而 ServiceClients 不会改变 CookieContainer 集合本身,底层的 WebRequest 会,它不是知道 WebRequest 是否围绕它同步访问——尽管我个人从未见过它们有任何问题。

    您可以通过以下方式禁用正在使用的 Cookie(即,如果您的客户端不需要会话):

    client.StoreCookies = false;
    

    【讨论】:

    • 如果使用相同的服务客户端进行异步调用,这可能会造成问题。您最终会遇到 System.InvalidOperationException: Cannot re-call BeginGetRequestStream/BeginGetResponse 而之前的调用仍在进行中。在 System.Net.HttpWebRequest.BeginGetResponse(AsyncCallback 回调,对象状态)在 ServiceStack.ServiceClient.Web.AsyncServiceClient.SendWebRequestAsync[TResponse](字符串 httpMethod,对象请求,RequestState`1 requestState,HttpWebRequest webRequest)
    • @WayneBrantley 你有这个例子吗?因为每个请求都会创建一个新的 HttpWebRequest。
    • 在 AppHost.Configure 中,我注册了一个继承自 JsonServiceClient 的自定义类的实例。此调用仅具有辅助方法并添加了 RequestFilter 以添加请求标头。然后我在整个 Web 应用程序中使用了相同的实例。这导致了上述错误,因此我将注册更改为具有 lambda 和“ReuseScope.None”。问题再也没有出现,所以我继续前进。这是服务堆栈 3.x
    • @WayneBrantley 好的,感谢您提供的信息,看起来我需要对此进行更多测试,因为我不确定在给定每个请求的情况下,新的 ServiceClient 实例与使用相同的客户端有何不同t 重用相同的底层请求实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2011-05-02
    • 2010-11-03
    • 1970-01-01
    • 2020-07-06
    • 2011-03-09
    • 2022-08-17
    相关资源
    最近更新 更多