我如何订购 SOAP 请求标头?
Posted
技术标签:
【中文标题】我如何订购 SOAP 请求标头?【英文标题】:How could I order SOAP request headers? 【发布时间】:2020-03-29 14:50:03 【问题描述】:当我注入我的服务时,我添加了一个 CustomEndpointBehavior 来添加一个 MessageInspector 来添加我需要成功请求的标头。
问题是我正在调用的 WCF 服务在 FIRST 标头中期待一个特定的标头,即 .NET 默认 XML 序列化器,由于他的名字而在 SECOND 标头处序列化(我认为这是问题所在)
private Configuration Configuration;
public MessageInspector(Configuration Configuration)
this.Configuration = Configuration;
public void AfterReceiveReply(ref Message reply, object correlationState)
public object BeforeSendRequest(ref Message request, IClientChannel channel)
var header1 = new Header1(Configuration);
var header2 = new Header2(Configuration);
request.Add(header1);
request.Add(header2);
return;
如何设置标题的顺序?如果它是序列化器的事情,我怎么能自定义序列化的顺序?
【问题讨论】:
您不应该期望发送的参数有任何顺序,尤其是对于请求标头。它们通常以无序的方式读取,其中为字典(或匿名对象)分配键/值,并且以任何顺序评估参数。 AFAIK,如果不使用 HttpClient 或更底层(更接近金属)发出您自己的请求,就无法指定标头参数的顺序。 【参考方案1】:据我所知,第一个soap头总是Action
头,表示要调用的操作合约的名称。后续自定义消息头将按照我们添加自定义消息头的顺序进行排序。
var header1 = MessageHeader.CreateHeader("header1", "", "header1value");
var header2 = MessageHeader.CreateHeader("header2", "", "header2value");
request.Headers.Add(header2);
request.Headers.Add(header1);
结果。 因此,恐怕将这些soap消息头排在Action Message头之前是不可行的。 此外,Data contract 的成员可以使用“Order”属性按固定顺序排序。
[DataContract]
public class Product
[DataMember(Order = 3)]
public int ID get; set;
[DataMember(Order = 5)]
public string Name get; set;
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-member-order 如果有什么可以帮助的,请随时告诉我。
【讨论】:
我认为是在注入服务时,我设置了自定义端点行为来对标头进行排序,但是在服务层调用此服务时,标头没有按我的顺序排序,我认为是在 .NET core 中注入服务时如何序列化以上是关于我如何订购 SOAP 请求标头?的主要内容,如果未能解决你的问题,请参考以下文章
如何在WPF应用程序中的SOAP客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头
如何在 WPF 应用程序中 SOAP 客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头