我正在使用VSTS2008 + C#+ .Net 3.5来开发IIS中托管的WCF服务。然后,我使用VSTS 2008中的“添加服务引用”功能自动生成客户端代理代码。
我的问题是,假设我创建了一个客户端代理实例,然后使用此特定实例来调用服务器端WCF服务公开的各种方法。那么,每次我进行方法调用时都会建立一个新连接吗?或者客户端和服务器之间会有一个持续的连接(即连接的生命周期是从创建客户端代理实例到处理客户端代理实例)?
我正在使用basicHttpBinding。
答案 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)
然后,每次我进行方法调用时都会建立一个新连接吗?
是的,这是默认行为和首选行为 - 它可以为您节省很多悲伤!
“这并不意味着服务的实例保持活跃” - 你是什么意思“服务实例保持活着”?
在“每次通话”服务的默认和首选情况下,会发生以下情况:
这是您的服务类应该尽可能独立于其他任何内容的原因之一 - 它们通常会针对每个请求进行实例化,然后释放。
这似乎是一个非常糟糕的主意 - 但是如果你的服务对象实例徘徊了很长时间,你就必须做大量的簿记才能跟踪他们的状态等等,所以最后,它实际上更容易(并且通常更安全和更简单)创建服务类,让它处理请求,然后再次释放它。
马克
答案 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
注意:这仅在您控制客户端和服务器时才有效。