如何修改WCF SOAP响应中Header的mustUnderstand值为0?
解决方案:修改WCF SOAP响应Header的MustUnderstand值
针对你的WCF服务返回的SOAP响应中,Action、Security等Header的mustUnderstand="1"导致Axis2客户端报错的问题,以下是具体解决方法:
1. 修改自定义MessageHeader的MustUnderstand值
如果是你自己定义的MessageHeader(比如示例中的ExtraValues),直接在[MessageHeader]属性中设置MustUnderstand=false即可:
[MessageHeader( Name = "OutOfBandData", Namespace = "http://www.examples.com", MustUnderstand=false // 改为false,对应SOAP中的0 )] public string ExtraValues { get { return extra; } set { this.extra = value; } }
2. 修改WS-Addressing Action头的MustUnderstand值
WCF会自动添加WS-Addressing的Action头,要修改它的MustUnderstand属性,需要通过**自定义消息检查器(IDispatchMessageInspector)**拦截并修改响应:
步骤1:实现IDispatchMessageInspector
public class MustUnderstandHeaderInspector : IDispatchMessageInspector { public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) { // 无需处理请求,返回null即可 return null; } public void BeforeSendReply(ref Message reply, object correlationState) { // 查找Action头 int actionIndex = reply.Headers.FindHeader("Action", "http://www.w3.org/2005/08/addressing"); if (actionIndex != -1) { // 修改MustUnderstand为false,对应SOAP响应中的mustUnderstand="0" reply.Headers[actionIndex].MustUnderstand = false; } } }
步骤2:实现IEndpointBehavior
public class MustUnderstandBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { // 将自定义检查器添加到服务端调度逻辑中 endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MustUnderstandHeaderInspector()); } public void Validate(ServiceEndpoint endpoint) { } }
步骤3:配置服务端行为
可以通过代码或配置文件两种方式添加该行为:
代码配置方式
ServiceHost host = new ServiceHost(typeof(YourService)); foreach (ServiceEndpoint endpoint in host.Description.Endpoints) { endpoint.Behaviors.Add(new MustUnderstandBehavior()); } host.Open();
配置文件方式
先注册行为扩展:
<system.serviceModel> <extensions> <behaviorExtensions> <add name="mustUnderstandBehavior" type="YourNamespace.MustUnderstandBehaviorElement, YourAssembly" /> </behaviorExtensions> </extensions> <!-- 端点行为配置 --> <behaviors> <endpointBehaviors> <behavior name="CustomEndpointBehavior"> <mustUnderstandBehavior /> </behavior> </endpointBehaviors> </behaviors> <!-- 服务配置 --> <services> <service name="YourNamespace.YourService"> <endpoint address="" binding="wsHttpBinding" contract="YourNamespace.IYourService" behaviorConfiguration="CustomEndpointBehavior" /> </service> </services> </system.serviceModel>
对应的BehaviorElement实现:
public class MustUnderstandBehaviorElement : BehaviorExtensionElement { public override Type BehaviorType => typeof(MustUnderstandBehavior); protected override object CreateBehavior() { return new MustUnderstandBehavior(); } }
3. 修改Security头的MustUnderstand值
如果Security头是WCF的WS-Security自动生成的,在上述BeforeSendReply方法中添加修改逻辑即可:
public void BeforeSendReply(ref Message reply, object correlationState) { // 修改Action头 int actionIndex = reply.Headers.FindHeader("Action", "http://www.w3.org/2005/08/addressing"); if (actionIndex != -1) { reply.Headers[actionIndex].MustUnderstand = false; } // 修改Security头 int securityIndex = reply.Headers.FindHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); if (securityIndex != -1) { reply.Headers[securityIndex].MustUnderstand = false; } }
原理说明
Axis2客户端报错的核心原因是:SOAP规范中mustUnderstand="1"要求客户端必须处理该Header,但你的Axis2客户端未实现Security头的处理逻辑。将mustUnderstand改为0(对应WCF中的false),即可告知客户端无需强制处理该Header,从而避免报错。
内容的提问来源于stack exchange,提问作者Dragon
相关产品推荐
相关产品推荐

