REST WCF 使得我们调用Web服务时,可以通过HttpRequest的交互简单完成。那么老版的WebService能否做到呢?WebService中通过HttpContext.Current.Rquest/Response,我们一样也可以改造WebMethod。
客户端: (详见注释)
1 // 创建一个DataTable 2 3 DataTable data = new DataTable("Project"); 4 5 data.Columns.Add("Name"); 6 7 data.Columns.Add("Birthday"); 8 9 data.Rows.Add(new object[] { "Wendy", "1978/03/11" }); 10 11 data.Rows.Add(new object[] { "Philip", "2000/11/05" }); 12 13 data.Rows.Add(new object[] { "Felix", "1999/08/04" }); 14 15 using (var ms = new MemoryStream()) 16 17 { 18 19 // 将DataTable用Xml格式写入流 20 21 data.WriteXml(ms, XmlWriteMode.WriteSchema); 22 23 var client = new WebClient(); 24 25 // 定义HttpRequest的Content-Type(xml,json等) 26 27 client.Headers.Add("Content-Type", "text/xml"); 28 29 var url = "http://localhost:2609/Service1.asmx/SendXml"; 30 31 // Send HttpRequest 32 33 var resp = client.UploadData(url, "POST", ms.ToArray()); 34 35 var strResp = System.Text.Encoding.UTF8.GetString(resp); 36 37 MessageBox.Show(strResp); 38 39 }
服务端:
1 [WebMethod] 2 3 public void SendXml() 4 5 { 6 7 // 获得客户端RAW HttpRequest 8 9 var inputStream = HttpContext.Current.Request.InputStream; 10 11 // 定义Response返回的格式是:Json 12 13 var response = HttpContext.Current.Response; 14 15 response.ContentType = "text/json"; 16 17 //var strXml = ""; 18 19 //using (var sr = new StreamReader(inputStream)) 20 21 // strXml = sr.ReadToEnd(); 22 23 try 24 25 { 26 27 DataTable data = new DataTable(); 28 29 using (var xr = XmlReader.Create(inputStream)) 30 31 data.ReadXml(xr); 32 33 // 将读入Xml的DataTable的行数返回客户端 34 35 string count = "/"" + data.Rows.Count + "/""; 36 37 response.BinaryWrite(System.Text.Encoding.UTF8.GetBytes(count)); 38 39 } 40 41 catch (Exception ex) 42 43 { 44 45 response.BinaryWrite(System.Text.Encoding.UTF8.GetBytes(ex.Message)); 46 47 } 48 49 }
客户端输出""3""
PS: 如果客户端的HttpRequest满足SOAP序列化格式,WebService会为WebMethod将消息反序列化成参数。相对应的客户端代理类也是通过将消息反序列化成对象供客户端使用。