调用SAP SOAP服务遇协议异常,请求技术排查指导
解决SOAP服务调用中'ReliableMessaging'消息头不被识别的协议异常
这个问题我之前对接SAP XI/PI的SOAP服务时也碰到过,核心原因就是你的WCF客户端发送了服务端不支持的WS-ReliableMessaging(WS-RM)消息头,而SOAPUI默认不会添加这类扩展头,所以能正常工作。下面给你两个可行的解决办法:
方法一:直接使用配置文件中的端点定义
你已经在App.Config里配置了正确的HTTPS端点和绑定,完全不需要手动创建Binding和EndpointAddress,直接引用配置好的端点名称即可,这样能确保客户端的配置和SOAPUI的请求行为一致:
// 直接使用App.Config中定义的HTTPS_Port端点 SegmentsClient client = new SegmentsClient("HTTPS_Port"); client.ClientCredentials.UserName.UserName = "sys_idwcons"; client.ClientCredentials.UserName.Password = "abdc"; SegmentResponse results = client.ListSegments(new SegmentRequest() { SegmentName = "" });
方法二:手动创建Binding时显式禁用WS-RM
如果你因为某些原因必须手动构建Binding,一定要显式禁用WS-ReliableMessaging特性——虽然BasicHttpBinding默认是禁用的,但有时候服务引用的生成逻辑或者WCF的版本差异会导致这个设置被意外启用:
public static BasicHttpBinding GetInitiativesBinding() { BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; binding.MaxReceivedMessageSize = 2147483647; binding.MaxBufferSize = 2147483647; binding.ReceiveTimeout = TimeSpan.FromMinutes(5); binding.SendTimeout = TimeSpan.FromMinutes(5); // 强制禁用WS-RM,避免生成服务端无法识别的消息头 binding.ReliableSession.Enabled = false; return binding; }
为什么会出现这个问题?
- SAP XI/PI的SOAP适配器通常不支持WS-ReliableMessaging这种扩展协议,所以当客户端发送带有
http://sap.com/xi/XI/Message/30命名空间下的ReliableMessaging头时,服务端直接无法识别并抛出异常。 - SOAPUI在发送请求时,只会严格按照WSDL定义的内容构建消息,不会自动添加这类WCF特有的扩展头,所以能正常对接。
额外验证技巧
你可以开启WCF的消息日志功能,查看客户端实际发送的SOAP请求内容,确认是否还包含ReliableMessaging相关的节点,以此验证问题是否彻底解决。
内容的提问来源于stack exchange,提问作者Shiva Kumar
相关产品推荐
相关产品推荐

