由于调用SOAP接口时,需要在SOAPHeader中添加一些子节点进行验证,但是我在度娘上找的都是SOAPheader中有一个子节点,然子节点中是那些属性,如下图所示:
但是对方的SOAP接口中要求的是在SOAPHeader中有一个wsa的命名空间,并且直接有两个子节点,这两个子节点都是在wsa的命名空间下,如下图:
由于看到需要在SOAP:Header中添加命名空间,然后就在网上找了好多资料,连试了n种方式都没有成功,后来想到是不是这个命名空间不需要在SOAP:Header中声明,只要子节点在这个命名空间中就可以了呢。
1.需要创建一个继承SoapHeader的类,此类就是Soap:Header下的子节点,在Action类的上方需要声明XML的命名空间,由于Action节点中没有子节点,只有文本,则需要在Action类中创建一个属性,并且属性需要声明成文本类型,而action类中的Namespaces属性是用来给命名空间取名的。
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类。