WebService 中操作 HttpRequest / HttpResponse (一)

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将消息反序列化成参数。相对应的客户端代理类也是通过将消息反序列化成对象供客户端使用。

原文地址:https://www.cnblogs.com/pigddyou/p/3003762.html