1

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

我在测试用例中尝试做的事情:

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

问题:

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

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

如何重现
:在 IIS 上发布服务器。从具有多个 IP 地址的不同计算机上执行客户端。客户端抛出超时异常,程序在 3 次尝试后退出 b. 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)、客户端:Windows XP

谢谢 GC

4

1 回答 1

0

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

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

当发生这样的 TimeoutException 时,您在服务器端做什么?你确保不要把那个异常一直冒泡到频道吗?

于 2010-03-17T17:06:05.273 回答