C# WCF 出现SOAPAction与HttpRequestMessageProperty值不匹配报错如何解决
问题根因
你猜测的问题原因完全正确:WCF框架默认会为消息内置的SOAP操作值自动包裹双引号,而你手动在HttpRequestMessageProperty中添加的SOAPAction值是不带引号的SendEcho,二者对比校验时就会触发不匹配错误。
可行解决方案
下面提供两种经过验证的实现方式,均可规避该问题:
方案1:手动为SOAPAction值补充双引号
直接修改原有添加请求头的逻辑,给值包裹双引号即可,修改后的代码如下:
public object BeforeSendRequest(ref Message request, IClientChannel channel) { var reqMsgProperty = new HttpRequestMessageProperty(); // 给SOAPAction值手动添加双引号,和WCF内置生成的格式对齐 reqMsgProperty.Headers.Add("SOAPAction", "\"SendEcho\""); reqMsgProperty.Headers.Add("Content-Type", "text/xml;charset=UTF-8"); request.Properties[HttpRequestMessageProperty.Name] = reqMsgProperty; //... return null; }
方案2:直接修改Message的Action属性(更推荐)
该方案更符合WCF的设计规范,不需要手动操作HTTP请求头,WCF会自动完成SOAPAction头的格式处理和属性同步,避免人为格式错误:
public object BeforeSendRequest(ref Message request, IClientChannel channel) { // 直接修改消息的Action属性,WCF会自动处理双引号和请求头同步 request.Action = "SendEcho"; var reqMsgProperty = new HttpRequestMessageProperty(); reqMsgProperty.Headers.Add("Content-Type", "text/xml;charset=UTF-8"); request.Properties[HttpRequestMessageProperty.Name] = reqMsgProperty; //... return null; }
补充说明:SOAP 1.1规范明确要求SOAPAction请求头的值需要用双引号包裹,WCF的默认处理逻辑符合标准规范,优先选择方案2可降低后续维护成本。
内容的提问来源于stack exchange,提问作者Get
相关产品推荐
相关产品推荐

