出處: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) |
04 | string uri = string.Format("{0}?who={1}", url, "joey"); |
05 | WebRequest request = WebRequest.Create(uri); |
06 | request.Method = "POST"; |
08 | string postData = "data={a:1, b:2, c:[3,4]}"; |
09 | byte[] byteArray = Encoding.UTF8.GetBytes(postData); |
10 | request.ContentType = "application/x-www-form-urlencoded"; |
12 | request.ContentLength = byteArray.Length; |
14 | using (Stream dataStream = request.GetRequestStream()) |
17 | dataStream.Write(byteArray, 0, byteArray.Length); |
20 | using (WebResponse response = request.GetResponse()) |
22 | using (Stream dataStream = response.GetResponseStream()) |
24 | using (StreamReader reader = new StreamReader(dataStream)) |
26 | string responseFromServer = reader.ReadToEnd(); |
27 | 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 方法
Source Code : serverPostAshx.zip
留言
張貼留言