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 To
和 Action
header。
我能够通过利用 OperationContextScope
的信息设置 To
和 Action
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;
}
}
我正在开发一个使用 SOAP WCF WS-Addressing 消息与遗留系统通信的客户端。
此外,需要自定义包含自定义信息的 SOAP-Envelope header To
和 Action
header。
我能够通过利用 OperationContextScope
的信息设置 To
和 Action
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;
}
}