今天测试用代码如何去调用WebService,因为之前都是直接vs直接引用,网上搜索的很多也并没有讲清楚,搞得一直不得劲。其实基元对象(string/int等)的调用倒是挺简单的,根据方法名赋值传参就可以了,一直搞不定的是自定义对象的访问。最后终于发现还是要仔细看WebService的方法描述说明呀。
先定义一个WebService方法:
发布后,打开WebService地址,我们点击查看方法的描述
可以看到一共有三种访问方法的方式:soap1.1,soap1.2,http post
灰色的描述其实已经告诉我们访问的方式。包括content-type,headers需要的参数等。我今天一直困在http post传复杂对象的问题上,后来查看对应的方法描述后才发现传递复杂对象是没有http post的访问方式的。对于所有的WebService方法,都可以用soap的方式进行访问,我们需要做的只是了解xml的格式然后传过去就可以了。
以下代码描述如何通过代码访问WebService,报文xml内容请参照灰色部分方法描述:
1 var xml = "your xml"; 2 var bytes = Encoding.UTF8.GetBytes(xml); 3 var url = "your url";//注意,是webservice入口,不是方法入口,如:http://localhost:19546/WebService.asmx 4 var request = (HttpWebRequest)WebRequest.Create(url); 5 request.Method = "POST"; 6 request.ContentType = "text/xml; charset=utf-8";//参照方法描述给 7 request.Accept = "text/html,application/xhtml+xml,application/xml"; 8 //request.Headers.Add("SOAPAction", url);//根据描述判断是否需要加上 9 request.ContentLength = bytes.Length; 10 var reqStream = request.GetRequestStream(); 11 reqStream.Write(bytes, 0, bytes.Length); 12 reqStream.Close(); 13 var rep = request.GetResponse(); 14 var stream = rep.GetResponseStream(); 15 System.IO.StreamReader sr = new System.IO.StreamReader(stream); 16 var ret = sr.ReadToEnd(); //ret 返回值也是xml格式,可以自行序列话成对象