我需要一些帮助来解决桌面客户端与 IIS 上托管的 WCF 服务的通信所面临的问题。

我想在我的测试用例中做什么:

  1. 服务器托管 WSDualHttpBinding 服务
  2. 客户端通过提供包含客户端 IP 地址的回调 uri 来建立连接(调用 Register 方法)
  3. 一旦建立连接,客户端应用程序就会启动网页。用户在文本框中输入一些文本,然后单击“发送”。该网页将文本发送到所有注册的桌面客户端。

问题:

在步骤 2 中,一台 PC 可能有多个 IP 地址(以太网适配器、环回适配器等)。如果在注册调用期间,此列表中的 IP 在回调 url 中发送,而该回调 url 无法从服务器回调(例如环回适配器IP),抛出超时异常。经过几次这样的尝试后,服务器无法再接受来自客户端的调用(无论是否有效的 IP)。有时会抛出“服务器太忙”异常。

(由于 DNS/WINS 配置问题导致服务器无法将计算机名称解析为正确的 IP 地址,因此我无法在回调 uri 中使用计算机的完全限定名称)。

如何重现:
A。在 IIS 上发布服务器。从具有多个 IP 地址的不同计算机执行客户端。客户在3次尝试后抛出超时异常和程序退出。App.Config 中的参数允许输入正确的 IP 地址(要使用的 IP)。现在,如果程序启动,一切都会正常。
C。如果我删除上面指定的此 IP 地址,从而使用不正确的 IP,则会再次发生步骤 a。在此模式下运行程序 2-3 次。
d.按照步骤 b 进行更改并运行程序。有时我会遇到超时异常。其他时候,网站就会出现。但是,当输入并发送文本时,它不会到达客户端。(即使 Web 服务没有收到任何调用,注册方法仍然有效。由于 Web 服务上没有注册客户端,发送功能失败。

我不确定为什么会发生这种情况以及如何解决。这是我的 Visual Studio 解决方案 - http://bit.ly/atKfOS

非常感谢任何意见和评论。环境:服务器 - Windows XP (IIS 5)、Windows Server 2008 SP2 x64 (IIS 7)、客户端:视窗XP

谢谢GC

有帮助吗?

解决方案

嗯,我想主要问题是这样的:当服务器尝试回调客户端但失败时,两者之间的通道将出现“故障”,并变得无用。

发生此类事件后,您必须处置客户端代理,并重新创建它 - 或者优雅地处理服务器上的超时异常(捕获它,将其转换为 SOAP 错误,记录它 - 无论如何 - 只是不要让未过滤的 .NET TimeoutException 传回客户端,这将使通道出现故障)。

当发生这样的 TimeoutException 时,您在服务器端会做什么?您是否确保不会将该异常一直冒泡到通道?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top