我如何订购 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”标头

在 SOAP UI 请求中将 cookie 作为请求标头发送以获取 REST Web 服务

调用rest服务时,soap服务中的请求格式确定失败

如何在PHP中传递SOAP标头和Body作为参数

在 Wcf 自定义发送端口上生成 SOAP 操作标头