Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何订购SOAP请求头?_C#_Wcf_Soap_Dependency Injection_.net Core - Fatal编程技术网

C# 如何订购SOAP请求头?

C# 如何订购SOAP请求头?,c#,wcf,soap,dependency-injection,.net-core,C#,Wcf,Soap,Dependency Injection,.net Core,当我注入服务时,我添加一个CustomEndpointBehavior来添加MessageInspector来添加成功请求所需的头 问题是,我调用的WCF服务期望在第一个标头处有一个特定的标头,.NET默认XML序列化程序在第二个标头处序列化,因为他的名字(我认为这就是问题所在) 如何设置标题的顺序?如果这是serializator的事情,我如何定制序列化的顺序呢?据我所知,第一个soap头总是操作头,它指示要调用的操作契约的名称。后续的自定义消息头将根据我们添加自定义消息头的顺序进行排序 va

当我注入服务时,我添加一个CustomEndpointBehavior来添加MessageInspector来添加成功请求所需的头

问题是,我调用的WCF服务期望在第一个标头处有一个特定的标头,.NET默认XML序列化程序在第二个标头处序列化,因为他的名字(我认为这就是问题所在)


如何设置标题的顺序?如果这是serializator的事情,我如何定制序列化的顺序呢?

据我所知,第一个soap头总是
操作
头,它指示要调用的操作契约的名称。后续的自定义消息头将根据我们添加自定义消息头的顺序进行排序

var header1 = MessageHeader.CreateHeader("header1", "", "header1value");
            var header2 = MessageHeader.CreateHeader("header2", "", "header2value");
            request.Headers.Add(header2);
            request.Headers.Add(header1);
结果。

因此,恐怕无法在操作消息头之前对这些soap消息头进行排序。
此外,数据契约的成员能够使用“order”属性按固定顺序进行排序

[DataContract]
    public class Product
    {
        [DataMember(Order = 3)]
        public int ID { get; set; }
        [DataMember(Order = 5)]
        public string Name { get; set; }
}


如果有什么我可以帮忙的,请随时告诉我。

您不应该期望发送的参数有任何顺序,尤其是请求头。它们通常以无序的方式读取,其中字典(或匿名对象)被分配键值,参数以任意顺序计算。顺便说一句,如果不向HttpClient或其他更低级(更接近金属)的东西发出自己的请求,就无法指定头参数的顺序。我认为这是在注入服务时,我设置了自定义端点行为来对头进行排序,但在服务层调用此服务时,这些头并不像我所说的那样被排序,我认为是关于在.NET内核中注入服务时如何序列化的问题
[DataContract]
    public class Product
    {
        [DataMember(Order = 3)]
        public int ID { get; set; }
        [DataMember(Order = 5)]
        public string Name { get; set; }
}