使用xmlhttp对象调用非本地webservice经常也遇到调用失败的情况,这应该是一个不断总结的过程.现列举我所经历过的困扰多时的细节错误,G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
假定一个天气预报的服务如下:G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
      using System;G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
using System.Web;G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
using System.Web.Services;G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
using System.Web.Services.Protocols;G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
    [WebService(Namespace
= "http://tempuri.org/")]G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
    [WebServiceBinding(ConformsTo
= WsiProfiles.BasicProfile1_1)]G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
public class Weather : System.Web.Services.WebServiceG*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
{G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
           
public Weather () {G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
             
//Uncomment the following line if using designed components G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
             
//InitializeComponent(); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
          }G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
          [WebMethod]G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
           
public string GetWeather(string cityName) {G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
                   
//根据城市名来返回天气情况G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
                   
return "Sunny";G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
            }
    G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
    }
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        1. 请求的方法 根据协议有Soap 1.1 Soap1.2 HttpPost HttpGet 四种方式G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        (1)SOAP 1.1G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
var data ='<?xml version="1.0" encoding="utf-8"?>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
+'<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/">'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
+'<soap:Body>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
+'<getWeather xmlns="http://tempuri.org/">'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
+'<cityName>hangzhou</cityName>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'</getWeather>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
+'</soap:Body>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
+'</soap:Envelope>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
function RequestService(){ G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
//Webservice location.G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
var URL="http://localhost:1323/WebSite/weather.asmx";G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.Open(
"Post",URL, false); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.SetRequestHeader (
"Content-Type","text/xml; charset=utf-8"); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.SetRequestHeader (
"Content-Length",data.length); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.SetRequestHeader (
"SOAPAction","http://tempuri.org/GetWeather"); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.Send(data);        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
    }
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        (2)SOAP 1.2G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
var data = '<?xml version="1.0" encoding="utf-8"?>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'<soap12:Body>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'<getWeather xmlns="http://tempuri.org/">'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'<cityName>hangzhou</cityName>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'</getWeather>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'</soap12:Body>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
+'</soap12:Envelope>'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
function RequestService(){ G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
//Webservice location.G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
var URL="http://localhost:1323/WebSite/weather.asmx";G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.Open(
"Post",URL, false); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.SetRequestHeader (
"Content-Type"," application/soap+xml; charset=utf-8"); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.SetRequestHeader (
"Content-Length",data.length);        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.Send(data);        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
    }
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        (3)HttpPost G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
var data = 'cityName=hangzhou'G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
function RequestService(){ G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
//Webservice location.G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
var URL="http://localhost:1323/WebSite/weather.asmx/getWeather";G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.Open(
"Post",URL, false); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.SetRequestHeader (
"Content-Type","  application/x-www-form-urlencoded"); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.SetRequestHeader (
"Content-Length",data.length);        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.Send(data);        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
    }
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
      G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        (4)HttpGetG*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
function RequestService(){ G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
//Webservice location.G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
       
var URL="http://localhost:1323/WebSite/weather.asmx/getWeather?cityName=hangzhou";G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.Open(
"GET ",URL, false); G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        xmlhttp.Send(
null);G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
    }
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        2.中文乱码G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        webservice接收和传输的消息都是UTF-8编码的,网上有很多解决GB2312传中文参数和接收中文消息乱码的办法,比如用prototype扩展xmlhttp对象,其实也不用那么麻烦,传递参数用escape转换一次,接收时用UTF8Encoding读取出来再根据需要转换即可,解决办法原理差不多.G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        3.解析返回的Xml DomDocument对象无法使用selectNodes和selectSingleNodeG*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
          其中一个原因是mozilla不支持此方法,可以通过prototype为它的domdocument对象扩展这两个同名方法,便于用相同的方法处理MS和mozilla兼容问题。但有时就是在IE里也不能正常使用这两个方法,常见情况是取出来的节点值为空。解决办法是在生成的domdocument对象(假设对象为xmlDom)设置一个属性 xmlDom.setProerty("Namespace",'xmlns="na:http://tempuri.org/"')指定一个默认命名空间的前缀,然后在selectNodes和selectSingleNode中使用前缀加标签名如 na:weather就可以了。G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
          4.“意外的以servicemethod/结尾“的错误(类似的格式)G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
          客户端以HttpGet或HttpPost方式调用非本地webservice报“意外的以servicemethod/结尾“的错误,其中一个原因是部署webservice的站点配置中默认是不开启httpget和httppost非本域请求许可的,因此要在web.config补上如下配置G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
<webServices>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
<conformanceWarnings>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
<clear />G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
<add name="BasicProfile1_1"/>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
</conformanceWarnings>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
<protocols>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
<add name="HttpSoap1.2"/>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
<add name="HttpSoap"/>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
<add name="HttpPostLocalhost"/>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
<add name="HttpPost"/> G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
<add name="HttpGet"/> G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
   
<add name="Documentation"/>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
</protocols>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
<soapExtensionTypes>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
</soapExtensionTypes>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
<soapExtensionReflectorTypes>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
</soapExtensionReflectorTypes>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
<soapExtensionImporterTypes>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
</soapExtensionImporterTypes>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
<wsdlHelpGenerator href="DefaultWsdlHelpGenerator.aspx"/>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
<serviceDescriptionFormatExtensionTypes>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
 
</serviceDescriptionFormatExtensionTypes>G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
</webServices>
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô
        希望打算使用xmlhttp的朋友能够避免这些小问题,也希望大家能够将自己遇到的问题和解决方法继续补全,方便查找也提高自己。上面列举的问题如有更易行的方法,也请指出来,交流一下。G*“²ú§’øSwww.netcsharp.cn» ôõ ½,5Ô