【问题标题】:WCF operation is not running after client disconnects客户端断开连接后 WCF 操作未运行
【发布时间】:2018-02-28 10:29:38
【问题描述】:

据我所知,BasicHttpBinding 不支持 ReliableSession 功能。因此,这意味着当服务器(wcf 主机)收到请求时,无论客户端是否断开连接,都会执行该请求。我希望我是对的?

问题是: 我有一个带有 BasicHttpBinding 的 WCF 服务。我们通过在客户端使用不同的线程调用它 10 次来测试该服务。而且这些请求都是同时(几乎)同时提出的。在线程调用之后,我们通过终止进程来终止程序。结果,10 个请求中有 6 个被执行,但有 4 个请求没有被执行。我们使用wireshark 检查了网络流量,发现wcf 服务主机收到了10 个请求。但是,我们知道其中有 4 人没有被处决。

(绑定时未配置超时值:这意味着它们都设置为默认值。wcf 服务也托管在 iis 上)。

这里有什么问题?我在哪里可以检查?即使客户端断开连接,我们如何才能实现 10 次执行中的 10 次?

【问题讨论】:

  • 您是否在服务中添加了以下属性? [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode= ConcurrencyMode.Multiple)] 处理并发请求必须设置并发模式。
  • 你可能是对的@RavirajPalvankar:docs.microsoft.com/en-us/dotnet/api/… 相反,当我调试案例时,它工作正常。假设我正在调试客户端和服务器。客户端发送 10 个请求,当第一个请求开始在服务器上执行时,我到达了一个制动点并停留在那里,直到我终止客户端应用程序。在终止之后,我让服务器继续处理并且它工作正常。所以在我调试的时候它可以工作,但我不调试的时候它不工作。
  • 请将并发模式设置为multiple,不要调试代码,但是有一个计数器什么的可以统计客户端和服务器端的调用次数,统计执行的调用次数,这样你就知道它是否真的发生了。
  • 现在我明白了为什么没有区别@RavirajPalvankar:我不希望同时运行我的服务。我只希望可靠地运行我的服务。我的意思是,主机是否可以一次执行 10 个或一个一个执行它们并不重要。我只想确保如果主机收到 10 个请求,那么将发生 10 次执行(并发或顺序执行都没有关系)。

标签: c# wcf basichttpbinding


【解决方案1】:

即使客户端断开连接,我们如何才能实现 10 次执行中的 10 次?

您可以将其设为默认行为。使用[OperationContract(IsOneWay=true)] 创建一个单向合约,其中客户端不等待回复,而只是在发送消息后断开连接。

【讨论】:

  • 返回某个值的 OperationContract 怎么样?
  • 如果您的客户断开连接,我猜他们不需要返回值。
  • 好吧@nvoigt;服务的操作旨在返回一些值。而且,作为客户,我需要确保执行对服务操作的许多异步调用。而且,作为客户,我对返回值不感兴趣:我不在乎它是否返回。但是服务的操作是以这种方式提供的:它肯定会返回一些值,没有其他方式。但作为客户端,我可能会忽略它:我不必将返回值存储在变量中,也不必在服务收到所有请求后保持客户端应用程序处于活动状态。
  • @rebulanyum 如果您不等待回复,您认为客户端在收到请求后如何了解服务?
  • 客户端也可以在等待响应时关闭操作系统。
【解决方案2】:

由于即使客户端断开连接,您也确实需要完成服务,我认为您需要完成一个数据库事务。

如果 WCF 连接到数据库,这将是正常的,特别是如果您使用相同的数据库用户和密码,如果是这种情况,请尝试为所有 WCF 实例连接一次。

无论哪种方式,您都必须确保您的 WCF 提供并发访问。点击here了解更多并发WCF访问的信息。

【讨论】:

  • 对不起@bilal-sultan-al-tamimi 但事实并非如此:对服务端的数据库事务不感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多