出處:http://www.dotblogs.com.tw/hatelove/archive/2011/12/02/asp.net-server-post-data-to-ashx-with-webrequest.aspx
前言
前陣子同事問我一個問題,要怎麼在server端post資料給遠端的.ashx。突然間我還真不知道怎麼做,因為通常都是在client端用ajax呼叫.ashx,如果是網站外的服務,通常都是Web service或WCF,.ashx還真沒碰到過。
所以survey了一下,寫了個小小Sample Code,當個memo。
需求
在server端post資料到.ashx,.ashx處理完後,接收.ashx的response。
範例
.aspx.cs
01 | protected void Button1_Click(object sender, EventArgs e) |
05 | string uri = string.Format("{0}?who={1}", url, "joey"); |
07 | WebRequest request = WebRequest.Create(uri); |
08 | request.Method = "POST"; |
11 | string postData = "data={a:1, b:2, c:[3,4]}"; |
13 | byte[] byteArray = Encoding.UTF8.GetBytes(postData); |
15 | request.ContentType = "application/x-www-form-urlencoded"; |
18 | request.ContentLength = byteArray.Length; |
21 | using (Stream dataStream = request.GetRequestStream()) |
24 | dataStream.Write(byteArray, 0, byteArray.Length); |
28 | using (WebResponse response = request.GetResponse()) |
30 | using (Stream dataStream = response.GetResponseStream()) |
32 | using (StreamReader reader = new StreamReader(dataStream)) |
34 | string responseFromServer = reader.ReadToEnd(); |
35 | this.Button1.Text = responseFromServer; |
.ashx
01 | public class MyHandler : IHttpHandler |
04 | public void ProcessRequest(HttpContext context) |
06 | context.Response.ContentType = "text/plain"; |
08 | var whom = context.Request.QueryString["who"]; |
16 | var result = HttpUtility.UrlDecode(context.Request.Form["data"]); |
17 | context.Response.Write(string.Format("{0} {1}", whom, result)); |
20 | private static string GetFromInputStream(HttpContext context) |
22 | var reader = new System.IO.StreamReader(context.Request.InputStream); |
23 | var result = reader.ReadToEnd(); |
28 | public bool IsReusable |
說明
- 使用WebRequest,Method屬性使用Post。
- 將要post的資料,assign到WebRequest的InputStream這個屬性。
- 在.ashx中,就可以透過context.Request.InputStream來取得Request post過來的資料。
- 透過Encoding.UTF8.GetString就可以將InputStream還原成原本的字串。(可能是序列化後的字串)
- 若有經過序列化(xml or json)可以將字串反序列化後,操作物件。
- .aspx透過Request的GetResponse(),可以取得.ashx的回應。
結果畫面
- 按按鈕前

- 按按鈕後

結論
因為太少碰到這樣的需求了,所以memo一下,順便練習一下WebRequest的用法。如果大家有更好的建議作法,麻煩請不吝告知,謝謝。
參考
- HttpRequest.InputStream 屬性
- WebRequest.GetRequestStream 方法
勘誤1:感謝同事的提醒,送Request的方式一樣,只需要在post的data加上Form的Key。接著在server端就能透過Request.Form取得data的資料,經過UrlDecode後就是原本的資料。程式碼已經同步修改了,感謝提醒。
勘誤2:感謝黑大提醒,將原本讀取InputStream的部分,改為直接用StreamReader的ReadToEnd(),更為簡潔。程式碼已經同步修改了,感謝提醒。
沒有留言:
張貼留言