HTML中调用带有SoapHeader头的WebService的两种方法

第一种:

function CallWebMethodWithHeader() {
                var soapXML =
                "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" +
                "  <soap:Header>" +
                    "<TestHeader xmlns='http://tempuri.org/'>" +
                        "<HeaderData xmlns='http://tempuri.org/'>111111111111</HeaderData>" +
                    "</TestHeader>" +
                "</soap:Header>" +
                "<soap:Body>" +
                    "<TestSoapHeader xmlns='http://tempuri.org/' />" +
                "</soap:Body>" +
                "</soap:Envelope>";

                $.ajax({
                    url: "http://localhost:40800/WebService/SoadHeader.asmx?op=TestSoapHeader",
                    type: "POST",
                    dataType: "xml",
                    contentType: "text/xml; charset=utf-8",
                    data: soapXML,
                    beforeSend: function (xhr) {
                        xhr.setRequestHeader('SOAPAction', 'http://tempuri.org/TestSoapHeader');

                    },

                    success: function (data) {
                        console.log(data);
                    },
                    error: function (err) {
                        alert("webmethod call failed");
                    }

                });

            }

            //调用
            CallWebMethodWithHeader();

第二种:采用Jquery Soap插件

插件地址:https://github.com/doedje/jquery.soap

这个插件在添加SOAPHeader的时候有两个问题:1、生成提交的XML中缺少命名空间;2、DEMO中提示可以直接toJSON,实际测试有问题。

关于第一个问题,需要在插件源代码的soapHeader配置部分增加一行代码,相关代码如下:

// SOAPHeader
            //soapObject.attr('xmlns', config.namespaceURL);
            if (!!config.SOAPHeader) {
                var soapHeader = SOAPTool.processData({
                    data: config.SOAPHeader,
                    name: 'temp',
                    prefix: ''
                });
                
                if (!!soapHeader) {
                    if (soapHeader.hasChildren()) {
                        for (var j in soapHeader.children) {
                            soapEnvelope.addHeader(soapHeader.children[j]);
                            //需要增加下面这行代码
                            soapHeader.children[j].attr('xmlns', config.namespaceURL);
                        }
                    } else {
                        soapEnvelope.addHeader(soapHeader);
                    }
                }
            }

客户端调用:

$.soap({
                url: 'http://localhost:40800/WebService/SoadHeader.asmx?op=',
                method: 'TestSoapHeader',
                namespaceURL: 'http://tempuri.org/',
                SOAPHeader: {
                    TestHeader:{ HeaderData: 'Basic'}
                },
                data:{
                },
                success: function (soapResponse) {
                    var x2js = new X2JS();
                    var jsonObj = x2js.xml_str2json(soapResponse);
                    console.log(jsonObj.Envelope.Body.TestSoapHeaderResponse);
                    // do stuff with soapResponse
                    // if you want to have the response as JSON use soapResponse.toJSON();
                    // or soapResponse.toString() to get XML string
                    // or soapResponse.toXML() to get XML DOM
                },
                error: function (SOAPResponse) {
                    //console.log(SOAPResponse);
                }
            });