【问题标题】:How could I order SOAP request headers?我如何订购 SOAP 请求标头?
【发布时间】: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 或更底层(更接近金属)发出您自己的请求,就无法指定标头参数的顺序。

标签: c# wcf soap dependency-injection .net-core


【解决方案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 中注入服务时如何序列化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
相关资源
最近更新 更多