WCF分布式开发常见错误(28):The requested upgrade is not supported by...
今天在调试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】错误截图:
运行时客户端抛出的英文异常信息如下图所示:
【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>
<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安全开发的时候是比较常见的。
参考链接:
转载于:https://blog.51cto.com/frankxulei/320448