对WCF客户端代理的并发访问

对WCF客户端代理的并发访问,wcf,concurrency,Wcf,Concurrency,我现在正在和WCF打交道,在这期间我遇到了一个问题,我不确定我是否走上了正确的道路 让我们假设一个简单的设置如下所示:客户端->服务1->服务2。 通信是基于tcp的 因此,我不确定的是,service1缓存service2的客户端代理是否有意义。因此,我可能获得对该代理的多线程访问,我必须处理它 我想利用tcp会话来获得更好的性能,但我不确定WCF/network/什么东西是否支持这种“体系结构”。我看到的问题是,如果我没有使用锁或其他同步,所有的通信都通过同一个通道 我想更好的办法是将代理缓

我现在正在和WCF打交道,在这期间我遇到了一个问题,我不确定我是否走上了正确的道路

让我们假设一个简单的设置如下所示:客户端->服务1->服务2。 通信是基于tcp的

因此,我不确定的是,service1缓存service2的客户端代理是否有意义。因此,我可能获得对该代理的多线程访问,我必须处理它

我想利用tcp会话来获得更好的性能,但我不确定WCF/network/什么东西是否支持这种“体系结构”。我看到的问题是,如果我没有使用锁或其他同步,所有的通信都通过同一个通道

我想更好的办法是将代理缓存在threadstatic变量中。 但在我这么做之前,我想确认只有一个代理实例并不是一个好主意

短暂性脑缺血发作
Martin

小心threadstatic,.net更改线程,使变量可以为null

对于会话…也许您可以使用启用会话的调用:

但如果没有任何性能问题,我不建议使用。我会使用普通方式,或者如果服务1仅用于转发,您可以在4.0中轻松使用该功能:


关于

首先,确保您了解ASP.NET应用程序中ThreadStatic的行为:

启动请求的同一线程可能不是完成请求的同一线程。基本上,在ASP.NET应用程序中存储线程本地存储的唯一安全方法是在HttpContext内部。下一个明显的方法是创建一个包装器客户端来管理WCF客户端代理,并使用锁确保每个IO请求都是线程安全的


虽然我个人的偏好是使用代理客户端池。每当您需要一个缓存时,将其从池队列中弹出,并在完成后将其重新打开。

如果您不知道存在性能问题,那么为什么要担心缓存?您将面临不正确地实现多线程代码的风险,并且没有任何明确的、可测量的好处


您是否已经测量了性能,或者分析了应用程序以了解它在哪里花费时间?如果没有,那么当您这样做时,您可能会发现多个TCP会话的开销并不是性能问题所在。您可能希望有时间优化应用程序的其他部分,但您将花时间优化一些不需要优化的内容。

我已经在使用这种结构。我有一个服务与其他一些服务协作,并实现了实现。当然,在我的例子中,客户机调用第一个服务的某个单向方法。我得到了很好的好处。当然,我还对其进行了配置,以限制某些情况下的并发调用数。

是的,WCF支持该体系结构。我每天都使用NetTCPBinding处理使用类似结构的应用程序


最需要担心的是所涉及的各种服务的并发模式,并确保它们不会不必要地阻塞。很容易进入这样一个场景:您将被保证超时,或者至少由于跨服务边界的多个同步调用而导致性能低下。即使单向调用也不能保证立即返回。

这是windows应用程序还是asp.net?-客户端是否转到服务1。。。服务1连接到服务2?为什么并发性是您关心的问题,也就是说,您同时(可能)向多个线程公开了什么资源?客户端是一个WinForms应用程序。Service1和Service2都是WCF服务,但在我想到的场景中,我只开发Service1和客户端。毫无疑问,Service1将是一个多线程的WCF服务。我只是不确定这个理论上的“第三方”服务是否应该只有一个代理实例。不,我没有衡量任何东西,因为这是为了更好地了解WCF和底层通信。我想到的一个场景(但没有提到)是,从客户端到服务器的带宽是有限的(例如UMTS连接),我不想让客户端打开很多TCP会话。