C# .NET 调用SOAP时在SOAPheader中添加节点 即WS-A Addressing节点

时间:2024-04-09 13:11:04

由于调用SOAP接口时,需要在SOAPHeader中添加一些子节点进行验证,但是我在度娘上找的都是SOAPheader中有一个子节点,然子节点中是那些属性,如下图所示:

C# .NET 调用SOAP时在SOAPheader中添加节点 即WS-A Addressing节点

但是对方的SOAP接口中要求的是在SOAPHeader中有一个wsa的命名空间,并且直接有两个子节点,这两个子节点都是在wsa的命名空间下,如下图:

C# .NET 调用SOAP时在SOAPheader中添加节点 即WS-A Addressing节点

由于看到需要在SOAP:Header中添加命名空间,然后就在网上找了好多资料,连试了n种方式都没有成功,后来想到是不是这个命名空间不需要在SOAP:Header中声明,只要子节点在这个命名空间中就可以了呢。

1.需要创建一个继承SoapHeader的类,此类就是Soap:Header下的子节点,在Action类的上方需要声明XML的命名空间,由于Action节点中没有子节点,只有文本,则需要在Action类中创建一个属性,并且属性需要声明成文本类型,而action类中的Namespaces属性是用来给命名空间取名的。

C# .NET 调用SOAP时在SOAPheader中添加节点 即WS-A Addressing节点

2.在根据wsdl文件生成的类中,需要添加属性 public Action action { get; set; }

然后再调用方法前添加[SoapHeader("action")]  注:引号中的内容需要和上面属性的必须一样

3.调用SOAP方法,把action的命名空间命名成wsa

var service = new SOAPService();

service.action = new Action(){

 Namespaces = new XmlSerializerNamespaces(),
                    action = "***"

};

action.Namespaces.Add("wsa", "***");

service.接口方法();

4.发送的xml是下面的格式(C#生成的xml是SOAP:Header,Java生成的xml是SOAPEVN:Header,这两个其实都是一样,不需要在在乎这两个的不同),因为我用到了三个子节点,所以我创建了三个继承于SoapHeader类。

C# .NET 调用SOAP时在SOAPheader中添加节点 即WS-A Addressing节点