Receive HTTP Post via ASP.Net Generic Handler(服務端與用戶端定時通訊機制)

來源:互聯網
上載者:User

假設我們要提供一個小小的服務,採用HTTP協議進行通訊,用戶端 POST 一些資料到伺服器上。用戶端不一定是PC,更不一定會按照一個Web Form的格式來提交資料,它可能是一個運行在PC上的Desktop Application,也可能是一個行動裝置。

伺服器端接收這樣的請求極其簡單,下面寥寥數行代碼即可實現:

在Web網站中建立一個Generic Handler(*.ashx),代碼如下:

[csharp]

  1. <%@ WebHandler Language="C#" Class="Echo" %>
  2. using System;
  3. using System.Web;
  4. using System.IO;
  5. public class Echo : IHttpHandler
  6. {
  7. private System.Text.Encoding DefaultEncoding = System.Text.Encoding.UTF8;
  8. public void ProcessRequest (HttpContext context)
  9. {
  10. context.Response.ContentType = "text/plain";
  11. context.Response.ContentEncoding = DefaultEncoding;
  12. Stream inputStream = context.Request.InputStream;
  13. using (StreamReader reader = new StreamReader(inputStream, DefaultEncoding))
  14. {
  15. string requestContent = reader.ReadToEnd();
  16. string responseContent = string.Format("Received: {0} <== END", requestContent);
  17. context.Response.Write(responseContent);
  18. }
  19. }
  20. public bool IsReusable
  21. {
  22. get { return false; }
  23. }
  24. }
<%@ WebHandler Language="C#" Class="Echo" %>using System;using System.Web;using System.IO;public class Echo : IHttpHandler{    private System.Text.Encoding DefaultEncoding = System.Text.Encoding.UTF8;        public void ProcessRequest (HttpContext context)    {        context.Response.ContentType = "text/plain";        context.Response.ContentEncoding = DefaultEncoding;        Stream inputStream = context.Request.InputStream;        using (StreamReader reader = new StreamReader(inputStream, DefaultEncoding))        {            string requestContent = reader.ReadToEnd();            string responseContent = string.Format("Received: {0} <== END", requestContent);                        context.Response.Write(responseContent);        }    }    public bool IsReusable    {        get { return false; }    }}

然後我們寫一個簡單的用戶端來測試它。在這個用戶端裡我們實現了一個類HttpClient來進行HTTP POST操作:

[csharp]

  1. // -----------------------------------------------------------------------
  2. // Http protocol client.
  3. // -----------------------------------------------------------------------
  4. namespace ConsoleClient
  5. {
  6. using System;
  7. using System.IO;
  8. using System.Net;
  9. using System.Text;
  10. /// <summary>
  11. /// Http protocol client.
  12. /// </summary>
  13. public class HttpClient
  14. {
  15. /// <summary>
  16. /// Post data to specific url and get response content.
  17. /// </summary>
  18. /// <param name="url">the url to post</param>
  19. /// <param name="postData">post data</param>
  20. /// <returns>response content</returns>
  21. public string Post(string url, string postData)
  22. {
  23. Uri uri = new Uri(url);
  24. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
  25. request.Method = "POST";
  26. request.ContentType = "application/x-www-form-urlencoded";
  27. Encoding encoding = Encoding.UTF8;
  28. byte[] bytes = encoding.GetBytes(postData);
  29. request.ContentLength = bytes.Length;
  30. using (Stream writer = request.GetRequestStream())
  31. {
  32. writer.Write(bytes, 0, bytes.Length);
  33. writer.Close();
  34. }
  35. return this.ReadResponse(request);;
  36. }
  37. /// <summary>
  38. /// Read response content from http request result.
  39. /// </summary>
  40. /// <param name="request">http request object</param>
  41. /// <returns>response content.</returns>
  42. private string ReadResponse(HttpWebRequest request)
  43. {
  44. string result = string.Empty;
  45. using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
  46. {
  47. using (Stream responseStream = response.GetResponseStream())
  48. {
  49. using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
  50. {
  51. result = reader.ReadToEnd();
  52. reader.Close();
  53. }
  54. }
  55. }
  56. return result;
  57. }
  58. }
  59. }
// -----------------------------------------------------------------------
// Http protocol client.// -----------------------------------------------------------------------namespace ConsoleClient{    using System;    using System.IO;    using System.Net;    using System.Text;    /// <summary>    /// Http protocol client.    /// </summary>    public class HttpClient    {        /// <summary>        /// Post data to specific url and get response content.        /// </summary>        /// <param name="url">the url to post</param>        /// <param name="postData">post data</param>        /// <returns>response content</returns>        public string Post(string url, string postData)        {            Uri uri = new Uri(url);            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);            request.Method = "POST";            request.ContentType = "application/x-www-form-urlencoded";            Encoding encoding = Encoding.UTF8;            byte[] bytes = encoding.GetBytes(postData);            request.ContentLength = bytes.Length;            using (Stream writer = request.GetRequestStream())            {                writer.Write(bytes, 0, bytes.Length);                writer.Close();            }            return this.ReadResponse(request);;        }        /// <summary>        /// Read response content from http request result.        /// </summary>        /// <param name="request">http request object</param>        /// <returns>response content.</returns>        private string ReadResponse(HttpWebRequest request)        {            string result = string.Empty;            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())            {                using (Stream responseStream = response.GetResponseStream())                {                    using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))                    {                        result = reader.ReadToEnd();                        reader.Close();                    }                }            }            return result;        }    }}

然後我們這樣就能得到HTTP POST的返回:

[csharp]

  1. // Replace the string content with your actual address please.
  2. string defaultUrl = "http://ServerName:8081/WebPath/AnyService.ashx";
  3. HttpClient client = new HttpClient();
  4. string response = client.Post(defaultUrl, @"abc 123! 測試 @");
  5. Console.OutputEncoding = System.Text.Encoding.UTF8;
  6. Console.WriteLine(response);
// Replace the string content with your actual address please.string defaultUrl = "http://ServerName:8081/WebPath/AnyService.ashx";HttpClient client = new HttpClient();string response = client.Post(defaultUrl, @"abc 123! 測試 @");Console.OutputEncoding = System.Text.Encoding.UTF8;Console.WriteLine(response);

假設Client與Server兩端都約定好採取某個格式對資料進行序列化與還原序列化,例如都採用Json,用戶端把對象通過Json封裝後Post給Server,Server再採用Json將對象從Json字串中解析出來,這樣進行資料傳遞是便利的。再假設我們要壓縮傳送出的資料量,那麼可以進行gzip壓縮與解壓。又假設我們要考慮安全性,那麼我們可以在對象的結構中添加security token進行認證,以及採用某種密碼編譯演算法對字串進行加密與解密。怎麼發揮就看您具體的應用了,構建一個屬於您自己的輕量的service易如反掌。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.