WCF SOAP端点问题:自动生成未请求的Header字段及命名空间不符
解决方案:移除WCF自动添加的和头并修正命名空间
核心问题分析
WCF默认会为SOAP请求自动注入WS-Addressing规范的<To>和<Action>头,尤其是当绑定的MessageVersion包含WS-Addressing定义时。而目标系统发送的是纯SOAP 1.1请求(无WS-Addressing扩展),同时契约命名空间不匹配,导致接收的请求头出现异常。
具体解决步骤
1. 绑定配置:禁用WS-Addressing
确保basicHttpBinding或自定义绑定的MessageVersion设置为纯SOAP 1.1,避免自动添加WS-Addressing头:
- 对于
basicHttpBinding:
<basicHttpBinding> <binding name="TargetSystemBinding"> <textMessageEncoding messageVersion="Soap11" /> <!-- 保留其他传输/安全配置 --> </binding> </basicHttpBinding>
- 对于自定义绑定(若之前尝试过):
<customBinding> <binding name="CustomTargetBinding"> <textMessageEncoding messageVersion="Soap11" /> <httpTransport /> <!-- 禁止添加<wsAddressing />元素 --> </binding> </customBinding>
2. 服务契约:统一命名空间并禁用自动Action
将服务契约的命名空间设置为与目标系统完全一致,同时显式禁用自动生成的Action头:
[ServiceContract(Namespace = "目标系统实际使用的命名空间")] public interface INewIntegrationService { [OperationContract(Action = "", ReplyAction = "*")] ServiceResponse ProcessServiceRequest(ServiceRequest request); }
注意:
Action = ""会告诉WCF不要自动生成Action头,ReplyAction = "*"允许接收任意格式的回复。
3. 自定义消息检查器:强制移除异常头
如果上述配置仍无法解决,添加自定义IDispatchMessageInspector在请求接收时移除自动注入的<To>和<Action>:
public class RemoveWsAddressingHeaders : IDispatchMessageInspector { public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) { // 移除To头 if (request.Headers.To != null) { request.Headers.RemoveAt(MessageHeaderIndex.To); } // 移除Action头 if (!string.IsNullOrEmpty(request.Headers.Action)) { request.Headers.RemoveAt(MessageHeaderIndex.Action); } return null; } public void BeforeSendReply(ref Message reply, object correlationState) { // 无需处理回复时留空 } }
将检查器添加到服务行为中:
<behaviors> <serviceBehaviors> <behavior name="NewIntegrationBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> <dispatchRuntime> <messageInspectors> <add type="你的程序集命名空间.RemoveWsAddressingHeaders, 你的程序集名称" /> </messageInspectors> </dispatchRuntime> </behavior> </serviceBehaviors> </behaviors>
4. 端点配置:关联正确的绑定与行为
确保新增的SOAP端点引用上述配置的绑定和行为:
<services> <service name="你的服务实现类" behaviorConfiguration="NewIntegrationBehavior"> <endpoint address="/NewIntegration" binding="basicHttpBinding" bindingConfiguration="TargetSystemBinding" contract="INewIntegrationService" /> </service> </services>
内容的提问来源于stack exchange,提问作者Santhosh P K
相关产品推荐
相关产品推荐

