Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF客户端连接问题_C#_.net_Wcf_Wcf Client - Fatal编程技术网

C# WCF客户端连接问题

C# WCF客户端连接问题,c#,.net,wcf,wcf-client,C#,.net,Wcf,Wcf Client,我正在使用VSTS2008+C#+.NET3.5开发托管在IIS中的WCF服务。然后我使用VSTS2008中的添加服务引用函数自动生成客户端代理代码 我的问题是,假设我创建了一个客户端代理实例,然后使用这个特定实例调用服务器端WCF服务公开的各种方法。那么,每次我进行方法调用时,它是否会建立新的连接?或者客户端和服务器之间会有一个固定的连接(即,连接的生命周期是从创建客户端代理实例到处理客户端代理实例) 我正在使用basicHttpBinding。在释放代理之前,连接一直保持 编辑 它将保持TC

我正在使用VSTS2008+C#+.NET3.5开发托管在IIS中的WCF服务。然后我使用VSTS2008中的添加服务引用函数自动生成客户端代理代码

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


我正在使用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。我想什么时候创建实例或者