2012-12-06 61 views
2

我有一个关于WCF代理创建一个问题,它可能是初级水平,但要问。我使用VS添加服务引用为我的客户端中的wcf服务创建了一个代理。现在因为该服务中的某些方法可能需要更长的时间来执行并阻止所有可用的代理连接,所以我想使用来自客户端的同一服务的不同代理对每个方法进行调用。WCF代理创建

现在的问题是:

  1. 是我的做法没错,我的意思是将这个解决我的目的是什么?
  2. 对于使用不同的代理做我需要使用不同的名称添加多个服务引用?
  3. 作为一个选项指向2我能不能添加服务引用一次,并在复制具有不同名称的配置相同的终点?所以每次我想创建一个新的代理服务器时,我都会在代理的构造函数中将不同端点的名称传递给同一服务。
  4. 而且是(多个代理=代理的多个实例)?

问候

回答

0

我认为最好的办法是使用异步操作的单一代理实例。 这就像网络浏览器 - 你可以在很多标签中看到相同的网页。它们都独立工作,但使用相同的端点资源。试着读something like this

+0

我不认为这是一个好主意。如果某个代理实例发生某些情况,则所有的异步调用都将失败,因为代理处于失败状态。 –

+0

为什么代理失败?应用程序错误可以处理,并且没问题。如果通道失败,其他实例也会失败,我想。即使只在失败时重新创建实例,它也比每次服务调用都要便宜。 – lavrik

+0

如果您有一些可以重新创建频道的智能代理,那么这应该不是问题。但代理可能因多种原因失败,这就是为什么他们内置了失败状态。 –

0

您可以使用一个单一的配置和单个端点的单一服务的参考。要在服务上并行调用多个方法,您可以在不同的线程中或在标记为async的不同方法中创建多个代理实例。

+0

史蒂夫,谢谢你的回应。我不仅关心并行呼叫,还关心连接池耗尽情况。因此,如果我的代理具有maxconnection = 10的设置,并且如果哪个块的方法获得前10个请求,则我的连接将耗尽。现在,如果请求另一个不阻塞的方法进入此请求,则不会传递给服务,因为连接数量已超过10个。希望我有道理,如果我在这里错过了一点,请纠正我。 – Zepher684

+0

这很有道理,但如果您将maxConnections设置的值和WCF服务可用资源的基础加载到服务必须处理的负载上,则可以避免发生这种情况。您还可以查看设置适当的发送和接收超时时间,并将系统设置为在出现时间过长时优雅地失败。 –