[轉貼] Server 端Post資料到 .ashx

 

出處: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

01protected void Button1_Click(object sender, EventArgs e)
02{
04    string uri = string.Format("{0}?who={1}", url, "joey");
05    WebRequest request = WebRequest.Create(uri);
06    request.Method = "POST";
07    //加上"data=",讓server端可以透過Request.Form["data"]讀取
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";
11    // Set the ContentLength property of the WebRequest.
12    request.ContentLength = byteArray.Length;
13    // Get the request stream.
14    using (Stream dataStream = request.GetRequestStream())
15    {
16        // Write the data to the request stream.
17        dataStream.Write(byteArray, 0, byteArray.Length);
18    }
19    // Get the response.      
20    using (WebResponse response = request.GetResponse())
21    {
22        using (Stream dataStream = response.GetResponseStream())
23        {
24            using (StreamReader reader = new StreamReader(dataStream))
25            {
26                string responseFromServer = reader.ReadToEnd();
27                this.Button1.Text = responseFromServer;
28            }
29        }
30    }
31}

.ashx

01public class MyHandler : IHttpHandler
02{
03  
04    public void ProcessRequest(HttpContext context)
05    {
06        context.Response.ContentType = "text/plain";
07        //Get QueryString
08        var whom = context.Request.QueryString["who"];
09  
10        //取得整個Request傳過來的InputStream資料
11        //var result = GetFromInputStream(context);
12  
13        //取得整個form資料
14        //var result = HttpUtility.UrlDecode(context.Request.Form.ToString());
15  
16        var result = HttpUtility.UrlDecode(context.Request.Form["data"]);
17        context.Response.Write(string.Format("{0} {1}", whom, result));
18    }
19  
20    private static string GetFromInputStream(HttpContext context)
21    {
22        var reader = new System.IO.StreamReader(context.Request.InputStream);
23        var result = reader.ReadToEnd();
24  
25        return result;
26    }
27  
28    public bool IsReusable
29    {
30        get
31        {
32            return false;
33        }
34    }
35  
36}

說明

  1. 使用WebRequest,Method屬性使用Post。
  2. 將要post的資料,assign到WebRequest的InputStream這個屬性。
  3. 在.ashx中,就可以透過context.Request.InputStream來取得Request post過來的資料。
  4. 透過Encoding.UTF8.GetString就可以將InputStream還原成原本的字串。(可能是序列化後的字串)
  5. 若有經過序列化(xml or json)可以將字串反序列化後,操作物件。
  6. .aspx透過Request的GetResponse(),可以取得.ashx的回應。

 

結果畫面

  1. 按按鈕前
    image
  2. 按按鈕後
    image


結論
因為太少碰到這樣的需求了,所以memo一下,順便練習一下WebRequest的用法。如果大家有更好的建議作法,麻煩請不吝告知,謝謝。

參考

  1. HttpRequest.InputStream 屬性
  2. WebRequest.GetRequestStream 方法

 

Source Code : serverPostAshx.zip

留言

這個網誌中的熱門文章

TeknoParrot 模擬器介紹,俗稱《鸚鵡模擬器》

[轉貼] ASP.NET傳遞參數給Crystal Report做Export或Print的動作