出處:
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
勘誤1:感謝同事的提醒,送Request的方式一樣,只需要在post的data加上Form的Key。接著在server端就能透過Request.Form取得data的資料,經過UrlDecode後就是原本的資料。程式碼已經同步修改了,感謝提醒。
勘誤2:感謝黑大提醒,將原本讀取InputStream的部分,改為直接用StreamReader的ReadToEnd(),更為簡潔。程式碼已經同步修改了,感謝提醒。