WCF客户端连接ASMX服务触发SoapHeaderException,如何解决?
解决WCF客户端调用带WSE 3.0的ASMX服务时的Action头缺失错误
错误原因分析
你遇到的SecurityFault是因为ASMX服务端启用了WSE 3.0的WS-Addressing强制校验,要求SOAP请求必须包含http://schemas.xmlsoap.org/ws/2004/08/addressing:Action头,但默认生成的WCF客户端不会自动添加这个符合WSE规范的头,导致服务端校验失败。
解决方案
1. 配置WCF客户端启用WS-Addressing(推荐)
修改客户端的App.config或Web.config,使用支持WS-Addressing的绑定配置:
<system.serviceModel> <bindings> <customBinding> <binding name="AsmxWseBinding"> <!-- 启用WS-Addressing 2004/08版本,匹配WSE 3.0要求 --> <wsAddressing addressingVersion="WSAddressing10" /> <textMessageEncoding messageVersion="Soap11" /> <httpTransport /> </binding> </customBinding> </bindings> <client> <!-- 将终结点的binding改为上面定义的customBinding --> <endpoint address="http://你的ASMX服务地址/Service.asmx" binding="customBinding" bindingConfiguration="AsmxWseBinding" contract="你的服务契约接口" name="ServiceSoap" /> </client> </system.serviceModel>
2. 手动在代码中添加Action头
如果配置方式不生效,可以在调用服务前,通过OperationContext手动注入Action头:
using (var client = new YourServiceClient()) { // 创建WS-Addressing Action头 var actionHeader = new MessageHeader<string>("http://你的服务命名空间/你的方法名"); var untypedHeader = actionHeader.GetUntypedHeader("Action", "http://schemas.xmlsoap.org/ws/2004/08/addressing"); // 将头添加到请求上下文 OperationContext.Current.OutgoingMessageHeaders.Add(untypedHeader); // 调用服务方法 client.YourServiceMethod(); }
注意替换http://你的服务命名空间/你的方法名为ASMX服务对应方法的实际Action值(可从原ASMX的WSDL中找到)。
3. 重新生成兼容的WCF代理
如果之前用svcutil生成代理时没有指定ASMX兼容参数,可以重新生成:
打开命令提示符,执行:
svcutil.exe http://你的ASMX服务地址/Service.asmx?wsdl /asmx /out:ServiceProxy.cs /config:App.config
/asmx参数会让svcutil生成更适配ASMX服务的代理配置,自动处理部分WSE兼容问题。
4. 确认服务端WSE配置(可选)
如果有权限修改服务端,可以检查Web.config中的WSE配置,确认是否必须强制校验Action头。如果非必要,可以调整RequireSoapHeaderAssertion的规则,但不推荐随意修改服务端配置,避免影响其他客户端。
内容的提问来源于stack exchange,提问作者Josephine
相关产品推荐
相关产品推荐

