WCF客户端连接问题

时间:2009-08-15 17:41:50

标签: c# .net wcf wcf-client

我正在使用VSTS2008 + C#+ .Net 3.5来开发IIS中托管的WCF服务。然后,我使用VSTS 2008中的“添加服务引用”功能自动生成客户端代理代码。

我的问题是,假设我创建了一个客户端代理实例,然后使用此特定实例来调用服务器端WCF服务公开的各种方法。那么,每次我进行方法调用时都会建立一个新连接吗?或者客户端和服务器之间会有一个持续的连接(即连接的生命周期是从创建客户端代理实例到处理客户端代理实例)?

我正在使用basicHttpBinding。

4 个答案:

答案 0 :(得分:5)

当底层通道关闭时,连接将被关闭 - 默认情况下,BasicHttpBinding在具有Keep-Alive值的消息中发送连接HTTP头,这使客户端能够建立与支持它们的服务的持久连接< / em>的。

这并不意味着服务实例保持活动,只是与Web服务器的连接,如果Web服务器支持它。

如果您希望在每次调用后关闭连接,则可以通过定义自定义绑定在服务器端将其关闭,这样

<services> 
 <service>
  <endpoint address=""
        binding="customBinding"
        bindingConfiguration="HttpBinding" 
        contract="IContract" />
 </service>
</services>

<bindings>
 <customBinding>
   <binding name="HttpBinding" keepAliveEnabled="False"/>
 </customBinding>
</bindings>

连接将根据您的代理挂起的时间而关闭,生成的代理会在需要时重新打开它。

答案 1 :(得分:3)

  
    

然后,每次我进行方法调用时都会建立一个新连接吗?

  

是的,这是默认行为和首选行为 - 它可以为您节省很多悲伤!

  
    

“这并不意味着服务的实例保持活跃” - 你是什么意思“服务实例保持活着”?

  

在“每次通话”服务的默认和首选情况下,会发生以下情况:

  • 客户端代理发出对服务的调用
  • 消息在客户端序列化并通过线路发送
  • 服务器端有一个“频道监听器”,它将接收该消息并查看将处理呼叫的服务类
  • 服务器端的消息调度程序将实例化“YourServiceClass”
  • 的实例
  • 服务器端的消息调度程序现在将在新创建的服务类实例上调用该方法,并获取结果并将其打包以用于respose
  • 释放服务器端的服务类对象
  • 将回复发送回您的客户

这是您的服务类应该尽可能独立于其他任何内容的原因之一 - 它们通常会针对每个请求进行实例化,然后释放。

这似乎是一个非常糟糕的主意 - 但是如果你的服务对象实例徘徊了很长时间,你就必须做大量的簿记才能跟踪他们的状态等等,所以最后,它实际上更容易(并且通常更安全和更简单)创建服务类,让它处理请求,然后再次释放它。

马克

答案 2 :(得分:2)

George,需要考虑的一件事是,您的代码应该尽量不关心连接打开或关闭的方式,时间或时间。这主要是渠道的关注点,渠道应该能够按照自己的意愿管理连接,而不必担心您编写的代码取决于渠道如何“关注自己的业务”。

只有当您看到或怀疑性能问题时,您才应该担心这样的实现细节。如果您担心可能存在此类问题,请创建快速概念验证应用程序,并使用Fiddler或其他工具观察网络流量。在大多数情况下,这将是浪费时间。

答案 3 :(得分:0)

保持连接直到代理处理完毕。

修改

如果您使用可靠的消息传递,它将保持TCP连接打开。我的基础是,如果TCP连接丢失,可靠的消息传递将失败。参见:

http://codeidol.com/csharp/wcf/WCF-Essentials/Reliability/

编辑2

我收回有关using语句的评论。参见:

http://msdn.microsoft.com/en-us/library/aa355056.aspx

有点偏离主题,但我们已停止使用添加服务参考,而是使用此处描述的方法:

http://www.dnrtv.com/default.aspx?showNum=103

注意:这仅在您控制客户端和服务器时才有效。