SOAP WCF WS-Addressing '找到多个 headers 名称 'Action' 和命名空间 'http://schemas.microsoft.com/ws/2005/05/addressing/none'。

SOAP WCF WS-Addressing 'Multiple headers with name 'Action' and namespace 'http://schemas.microsoft.com/ws/2005/05/addressing/none' found.'

我正在开发一个使用 SOAP WCF WS-Addressing 消息与遗留系统通信的客户端。

此外,需要自定义包含自定义信息的 SOAP-Envelope header ToAction header。

我能够通过利用 OperationContextScope 的信息设置 ToAction SOAP-Envelope header,如下面的代码所示:


public async Task<getAttorneyResponseStructure> GetAttorneyAsync(GetAttorneyRequestStructure getAttorneyRequestStructure)
{
  try
  {
    using (new OperationContextScope(Client.InnerChannel))
    {
      getAttorneyRequestStructure.AttorneyHeader = Header;

      OperationContext.Current.OutgoingMessageHeaders.To = new Uri("http://rydwvgsn01.spga.gov.sa/GSBExpress/Legal/MOJAttorneyInquiry/2.0/AttorneyInquiryService.svc");

      OperationContext.Current.OutgoingMessageHeaders.Action = "http://tempuri.org/IAttorneyInquiryService/GetAttorney";

      return await Client.GetAttorneyAsync(getAttorneyRequestStructure);
    }
  }
  catch (Exception e)
  {
   throw;
  }
}

当我 运行 代码并尝试发送消息时,我以异常结束 Multiple headers with name 'Action' and namespace 'http://schemas.microsoft.com/ws/2005/05/addressing/none' found.

通过查看图片中附加的异常堆栈,似乎有一个 object 包含与我要添加的 header 相同的信息。

所以,我的问题是,是否可以更改 Action header 的命名空间或修改包含命名空间集的现有 Action

已解决! 事实证明,问题是我使用的默认 BasicHttpBinding 使用的是与服务器不同的 soap 版本。此外,不需要 header 中的 Action 属性,因为我在连接构造函数中使用 CustomBinding 更改了 SOAP 版本:

CustomBinding binding = new CustomBinding();

var mtomMessageEncodingBindingElement = new MtomMessageEncodingBindingElement
{
  MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap11, AddressingVersion.WSAddressing10),
};
binding.Elements.Add(mtomMessageEncodingBindingElement);

var httpTransportBindingElement = new HttpTransportBindingElement();
binding.Elements.Add(httpTransportBindingElement);
            
Client = new AttorneyInquiryServiceClient(binding, new EndpointAddress("http://rydwvgsn01.spga.gov.sa/GSBExpress/Legal/MOJAttorneyInquiry/2.0/AttorneyInquiryService.svc"));

以上代码的补充说明:

  • MtomMessageEncodingBindingElement: 用于设置 SOAP 版本的版本和启用 MOTM 类型的响应。

  • HttpTransportBindingElement: 绑定中需要

  • 方法调用中,删除了Action

public async Task<getAttorneyResponseStructure> GetAttorneyAsync(GetAttorneyRequestStructure getAttorneyRequestStructure)
{
  try
  {
    using (new OperationContextScope(Client.InnerChannel))
    {
      getAttorneyRequestStructure.AttorneyHeader = Header;

      OperationContext.Current.OutgoingMessageHeaders.To = new Uri("http://rydwvgsn01.spga.gov.sa/GSBExpress/Legal/MOJAttorneyInquiry/2.0/AttorneyInquiryService.svc");

      return await Client.GetAttorneyAsync(getAttorneyRequestStructure);
    }
  }
  catch (Exception e)
  {
   throw;
  }
}