今天在调试WCF4.0 Routing 路由服务例子代码的时候,启动客户端测试WCF路由服务,遇到这个错误。
因为网上资料很少,目前搜索不到任何中文资料。英文资料也十分少,google.com搜索的连接也被屏蔽了,不能访问。所以把这个问题的解决办法发出来,共大家参考,希望对后来遇到类似错误的人一个参考。
【1】调试环境:
  1)操作系统:Windows XP 专业版
  2)IDE环境:Visual Studio 2010 Beta2
  3)Framework: .NET Framework 4.0
【2】错误信息:
  Error : The requested upgrade is not supported by 'net.tcp://localhost:9002/WCFServiceB'. This could be due to mismatched bindings (for example security enabled on the client and not on the server).
 
  错误:服 'net.tcp://localhost:9002/WCFServiceB'不支持请求升级。这可能是由于绑定不匹配导致的错误(例如客户端启用安全,而服务器没有。)。
【3】错误截图:
   运行时客户端抛出的英文异常信息如下图所示:
WCF分布式开发常见错误(28):The requested upgrade is not supported by...
【4】问题分析:
      这个错误的原因,在异常信息里有部分提示:可能绑定不匹配导致的错误。
  1)客户端和服务端安全模式不同,例如客户端启用安全,而服务端没有启用安全;
  2)客户端和服务端编码模式不同;导致无法匹配错误信息。
  3)客户端和服务端SOAP版本不同。也可能导致问题。
  4)客户端和服务端事务设置不同等等。
      都可能导致这个错误。我们先来检查服务端和客户端的配置,发现服务端没启用安全,而路由服务在对于客户端绑定的配置使用的是默认的设置,也就是启用了传输安全模式。
【5】解决办法:
  为了解决这个问题,必须保持客户端配置和服务的一致性。就是在客户端针对终结点,添加如下配置:
 <system.serviceModel>
    
<services>
         
<client>
      
<endpoint name="EndPointB"  bindingConfiguration="netTcpConfig"
                address
="net.tcp://localhost:9002/WCFServiceB"
                binding
="netTcpBinding"
                contract
="*" />
    
</client>
    
<bindings>
      
<netTcpBinding>
        
<binding name="netTcpConfig">
          
<security mode="None">
          
</security>
        
</binding>
      
</netTcpBinding>
    
</bindings>
     
</system.serviceModel>
</configuration>
 
    这样就保证了客户端和服务端配置的一致性。重启程序,这样就可以调用成功了。
【总结】
  因为WCF针对消息属性的设置,大部分都是通过绑定来控制的。如果客户端和服务端绑定不同,或者绑定的设置不同,就可能导致消息的编解码或者结构不同,进而出现无法解析等错误,也就是我们通常看到的客户端无法和服务端通信,这个在WCF安全开发的时候是比较常见的。
参考链接: