之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService。这里还想说一句,还是 web api 的调用简单。
WebService 服务端代码:
public class WebServiceDemo : System.Web.Services.WebService{[WebMethod]public string HelloWorld(){return "Hello World";}[WebMethod]public string Sum(string param1, string param2){int num1 = Convert.ToInt32(param1);int num2 = Convert.ToInt32(param2);int sum = num1 + num2;return sum.ToString();}}
很简单的代码,只是用于演示。
客户端调用代码:
class Program{static void Main(string[] args){Program program = new Program();string url = "http://localhost:12544/WebServiceDemo.asmx";string method = "Sum";string num1 = "1";string num2 = "2";string result = program.HttpPostWebService(url, method, num1, num2);Console.WriteLine(result);Console.ReadKey();}public string HttpPostWebService(string url,string method,string num1,string num2){string result = string.Empty;string param = string.Empty;byte[] bytes = null;Stream writer = null;HttpWebRequest request = null;HttpWebResponse response = null;param = HttpUtility.UrlEncode("param1") + "=" + HttpUtility.UrlEncode(num1) + "&" + HttpUtility.UrlEncode("param2") + "=" + HttpUtility.UrlEncode(num2);bytes = Encoding.UTF8.GetBytes(param);request = (HttpWebRequest)WebRequest.Create(url + "/" + method);request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";request.ContentLength = bytes.Length;try{writer = request.GetRequestStream(); //获取用于写入请求数据的Stream对象}catch (Exception ex){return "";}writer.Write(bytes, 0, bytes.Length); //把参数数据写入请求数据流writer.Close();try{response = (HttpWebResponse)request.GetResponse(); //获得响应}catch (WebException ex){return "";}#region 这种方式读取到的是一个返回的结果字符串Stream stream = response.GetResponseStream(); //获取响应流XmlTextReader Reader = new XmlTextReader(stream);Reader.MoveToContent();result = Reader.ReadInnerXml();#endregion#region 这种方式读取到的是一个Xml格式的字符串//StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);//result = reader.ReadToEnd();#endregionresponse.Dispose();response.Close();//reader.Close();//reader.Dispose();Reader.Dispose();Reader.Close();stream.Dispose();stream.Close();return result;}}
第一种读取方式的返回结果:

第二种读取方式的返回结果:
PS:如果遇到调用时报错,可以尝试在服务端(即WebService)的 web.config 配置中添加如下配置节点。
<system.web><webServices><protocols><add name="HttpPost" /></protocols></webServices></system.web>
