出處: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
留言
張貼留言