none
WCF端口与防火墙设置的问题 RRS feed

  • 问题

  • 各位

    当我更改Windows防火墙,屏蔽掉WCF服务所用的端口号之后,本来想象的是客户端会立刻报错,

    实际情况却是,客户端发出请求后画面就会死掉,直到Timeout之后才能报错。

    怎么才能做到和WCF未启动一样的效果呢?

     

    现在的问题是这样地:当WCF启动但还没有完全启动完毕的途中,如果客户端有请求过来,就会Timeout。

    由于直到Timeout为止画面长时间都没有反应,用户感觉好像死机一样。

    所以我一开始设想暂时防火墙屏蔽端口,启动WCF服务完毕之后再开启端口,谁知道结果也是Timeout...

     

    请问这个问题谁有好的办法没有?谢谢

     

    2010年12月13日 7:37

答案

  • 你好,

    你可以尝试设置客户端Binding.OpenTimeout为较小的值,然后让客户端在调用serviceoperation前用ClientBase.Open 方法连接服务。 同时,为了防止客户端界面卡死的问题,建议你生成异步的wcf proxy,然后调用异步的Open方法。

    谢谢,


    Mog Liang
    • 已建议为答案 Mog Liang 2010年12月20日 8:19
    • 已标记为答案 Mog Liang 2010年12月21日 7:08
    2010年12月17日 8:07

全部回复

  • 你好,我的服务器端是self-host,WindowsConsole的。不过好像上面这两个讨论和我的问题并不一样。

     

    服务器端启动需要花个几秒钟我觉得是没有问题的,问题在于恰好在“要启动未启动”这个节骨眼上客户端发来请求的话,既不能立刻返会错误,也不能正常处理,只能等待到Timeout这次请求才能结束。

    用Windows防火墙屏蔽掉服务器端的WCF用端口也一样,客户端发过来请求,明明端口号不可用,但是没法立刻返回错误,非要等到Timeout才出错。

     

    这种现象是正常的么...

     

     

     

    2010年12月14日 6:51
  • 这个TimeOut异常有很多原因。

    处理时间过久,或者打开时间过久都会导致TimeOut异常。

    你现在的情况是,客户端和服务端已经建立了有效的链接,

    而这个Channel是正常的,如果服务端立即断掉,客户端是无法立即知道。

     

    你可以采用一个办法,就是服务关闭前发送和消息给客户端,通知客户端。类似回调的机制。

     


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2010年12月14日 10:15
    版主
  • 谢谢

    我在XP上另搭建了一个测试服务器,发现Timeout没有再现。

    仔细调查了一下,出现问题的服务器是Windows2008,其IIS上已经运行了一个站点,使用的端口为8080,和WCF服务的端口号相同。

    怀疑是不是这个原因导致的,准备切换一下端口继续测试。

     

    (在XP下如果IIS和WCF服务用同一端口号的话,根本就无法启动)

    2010年12月14日 11:07
  • 谢谢

    我在XP上另搭建了一个测试服务器,发现Timeout没有再现。

    仔细调查了一下,出现问题的服务器是Windows2008,其IIS上已经运行了一个站点,使用的端口为8080,和WCF服务的端口号相同。

    怀疑是不是这个原因导致的,准备切换一下端口继续测试。

     

    (在XP下如果IIS和WCF服务用同一端口号的话,根本就无法启动)

    在XP下如果IIS和WCF服务用同一端口号的话无法启动的原因:

    "IIS 在 Windows XP 上不支持端口共享。如果 IIS 正在运行并且 WCF 服务尝试通过相同端口来使用某个命名空间,则 WCF 服务将无法启动。IIS 和 WCF 均默认设置使用端口 80。请更改其中一个服务的端口分配或使用 IP 侦听列表将 WCF 服务分配到 IIS 未使用的网络适配器。IIS 6.0 和更高版本已经过重新设计,可以使用 HTTP 服务器 API。"


    关于WCF服务与Windows2008/IIS共用一个端口的问题, 你的WCF服务是基于TCP还是HTTP? 如果是TCP, 那是不能共用端口的. 请参阅Phani_tpk于2008年12月31日8:17在以下讨论里的答复 http://social.msdn.microsoft.com/Forums/zh-CN/wcf/thread/77448cef-02a7-456e-9750-a7154648b635

    2010年12月15日 1:15
  • 谢谢

    我在XP上另搭建了一个测试服务器,发现Timeout没有再现。

    仔细调查了一下,出现问题的服务器是Windows2008,其IIS上已经运行了一个站点,使用的端口为8080,和WCF服务的端口号相同。

    怀疑是不是这个原因导致的,准备切换一下端口继续测试。

     

    (在XP下如果IIS和WCF服务用同一端口号的话,根本就无法启动)

    在XP下如果IIS和WCF服务用同一端口号的话无法启动的原因:

    "IIS 在 Windows XP 上不支持端口共享。如果 IIS 正在运行并且 WCF 服务尝试通过相同端口来使用某个命名空间,则 WCF 服务将无法启动。IIS 和 WCF 均默认设置使用端口 80。请更改其中一个服务的端口分配或使用 IP 侦听列表将 WCF 服务分配到 IIS 未使用的网络适配器。IIS 6.0 和更高版本已经过重新设计,可以使用 HTTP 服务器 API。"


    关于WCF服务与Windows2008/IIS共用一个端口的问题, 你的WCF服务是基于TCP还是HTTP? 如果是TCP, 那是不能共用端口的. 请参阅Phani_tpk于2008年12月31日8:17在以下讨论里的答复 http://social.msdn.microsoft.com/Forums/zh-CN/wcf/thread/77448cef-02a7-456e-9750-a7154648b635

    谢谢。xp下不能共享端口,明白了。

    我用的是HttpBinding,2008下搭建了一个和IIS共用端口8080的测试环境,客户端不停的向WCF发送检索请求,开始是正常的。

    途中将WCF服务关掉,重启,回复正常,但又经过一段时间之后果然出现了TimeoutException,从此WCF服务彻底处于不可用状态。

     

    原因还在继续研究中....

    2010年12月15日 3:42
  • 将WCF服务关掉時有否使用close()? maxConcurrentCalls设置為何?

    建议您使用WCF Trace Viewer作进一步调查.
    2010年12月15日 4:03
  • 将WCF服务关掉時有否使用close()? maxConcurrentCalls设置為何?

    建议您使用WCF Trace Viewer作进一步调查.

    谢谢,关掉WCF服务器端的时候确实是直接关闭Console程序,这样的话Close()应该没有被调用。这样也会有问题啊。

     

    maxConcurrentCalls这些值都设为1000,估计,应该不是这个问题。。。

    2010年12月16日 3:08
  • 你好,

    你可以尝试设置客户端Binding.OpenTimeout为较小的值,然后让客户端在调用serviceoperation前用ClientBase.Open 方法连接服务。 同时,为了防止客户端界面卡死的问题,建议你生成异步的wcf proxy,然后调用异步的Open方法。

    谢谢,


    Mog Liang
    • 已建议为答案 Mog Liang 2010年12月20日 8:19
    • 已标记为答案 Mog Liang 2010年12月21日 7:08
    2010年12月17日 8:07
  • 谢谢。思路又开阔了一些。
    2010年12月17日 8:28