出處: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(),更為簡潔。程式碼已經同步修改了,感謝提醒。
沒有留言:
張貼留言