C# WCF客户端连接问题
我正在使用VSTS2008+C#+.NET3.5开发托管在IIS中的WCF服务。然后我使用VSTS2008中的添加服务引用函数自动生成客户端代理代码 我的问题是,假设我创建了一个客户端代理实例,然后使用这个特定实例调用服务器端WCF服务公开的各种方法。那么,每次我进行方法调用时,它是否会建立新的连接?或者客户端和服务器之间会有一个固定的连接(即,连接的生命周期是从创建客户端代理实例到处理客户端代理实例)C# WCF客户端连接问题,c#,.net,wcf,wcf-client,C#,.net,Wcf,Wcf Client,我正在使用VSTS2008+C#+.NET3.5开发托管在IIS中的WCF服务。然后我使用VSTS2008中的添加服务引用函数自动生成客户端代理代码 我的问题是,假设我创建了一个客户端代理实例,然后使用这个特定实例调用服务器端WCF服务公开的各种方法。那么,每次我进行方法调用时,它是否会建立新的连接?或者客户端和服务器之间会有一个固定的连接(即,连接的生命周期是从创建客户端代理实例到处理客户端代理实例) 我正在使用basicHttpBinding。在释放代理之前,连接一直保持 编辑 它将保持TC
我正在使用basicHttpBinding。在释放代理之前,连接一直保持 编辑 它将保持TCP连接打开,至少如果您使用可靠的消息传递。基于此,如果TCP连接丢失,可靠的消息传递将失败。见: 编辑2 我收回关于using语句的评论。见: 有点离题,但我们已经停止使用Add Service引用,而是使用下面描述的方法:
注意:这仅在您同时控制客户端和服务器时有效。当基础通道关闭时,连接将关闭-默认情况下,BasicHttpBinding在消息中发送一个连接HTTP头,并带有保持活动的值,这使客户端能够建立到支持它们的服务的持久连接 这并不意味着该服务的实例保持活动状态,而只是与web服务器的连接(如果web服务器支持的话) 如果希望在每次调用后关闭连接,则可以通过定义自定义绑定在服务器端关闭连接
<services>
<service>
<endpoint address=""
binding="customBinding"
bindingConfiguration="HttpBinding"
contract="IContract" />
</service>
</services>
<bindings>
<customBinding>
<binding name="HttpBinding" keepAliveEnabled="False"/>
</customBinding>
</bindings>
连接将根据您的代理挂起多长时间而关闭,如果需要,生成的代理将重新打开它。
< P>乔治,有一件事要考虑的是,您的代码应该尽量不关心连接如何打开、关闭或关闭。这主要是频道所关心的问题,频道应该能够根据自己认为合适的方式管理连接,而不必担心您编写的代码取决于频道“如何处理自己的业务” 只有当您看到或怀疑性能问题时,才应该担心这样的实现细节。如果您担心可能会出现这样的问题,那么创建一个快速概念验证应用程序,并使用Fiddler或其他工具观察网络流量。在大多数情况下,这将是浪费时间 那么,每次我进行方法调用时,它是否会建立新的连接 是的,这是默认的行为和首选的行为-它为你节省了很多悲伤 “这并不意味着服务实例保持活动”——你说的“服务实例保持活动”是什么意思 在“每次呼叫”服务的默认和首选情况下,会发生以下情况:- 客户端代理向服务发出调用
- 消息在客户端序列化并通过网络发送
- 服务器端有一个“通道侦听器”,它将拾取该消息并查看哪个服务类将处理该调用
- 服务器端的消息调度程序将实例化“YourServiceClass”的实例
- 服务器端的消息调度器现在将在新创建的服务类实例上调用该方法,并获取结果并打包以供响应
- 服务器端的服务类对象被释放
- 响应将发送回您的客户机
Marc谢谢,那么这是否意味着在代理释放之前底层TCP连接保持打开(活动)?不,你不应该这样做。将代理包装为using是一个坏主意,因为如果在出现故障的状态下对代理调用Dispose,那么它会抛出一个异常,隐藏一开始导致故障的异常。感谢Shiraz,如果我没有使用可靠的消息传递,而只使用basicHttpBinding的默认设置,那么基础连接是否始终处于活动状态?或者每次我们调用一个方法时,都会有一个新的连接?嗨,blowdart,你对我原来问题的回答如何?:-)Hi Shiraz,我看了你推荐的视频10分钟,它真的很酷很有用,但是它是否包含关于你使用Add Service Reference的替代方法的信息?请帮忙澄清,谢谢。谢谢!两个困惑,1。“这并不意味着服务实例保持活动”——你说的“服务实例保持活动”是什么意思?2.“如果web服务器支持它。”——对于IIS,如何检查是否支持?对不起,还有两个困惑,3。“如果需要,生成的代理将重新打开它。”——底层WCF将自动处理它,如果连接关闭并再次打开,不会引发异常?开发人员不需要处理这个场景?4.“连接将根据代理挂起的时间而关闭”--是否可配置?“服务实例”是指web服务器计算机上实现服务契约的类的实例。有些人认为,当您创建代理实例时,它会创建服务实例。这不是真的。谢谢约翰,1。我想什么时候创建实例或者