1. 程式人生 > >.net中http介面相關

.net中http介面相關

最近要寫介面,其中有一個要使用頁面去接受資料,想了想怎麼處理,想到一個方案。

要求是點選按鈕向一個aspx頁面post資料並且開啟這個頁面並顯示post來的資料,於是搜尋到了一個解決方案

首先在發起跳轉和傳資料的頁面做手腳,搜尋到了一個文章,介紹到了一個httphelper,文章連結:http://www.cnblogs.com/gb2013/p/aspnet_post_and_redirect.html

於是用這個成功實現了跳轉,但是是當前頁面,而不是新開的一個新的頁面視窗,於是看這個類裡面的PreparePOSTForm方法,然後做了改動,將form加了個target="_blank",於是實現了跳轉新開啟頁面並post資料,該類方法不做解釋,看類程式碼就懂了。

在接收資料的頁面,也就是目標aspx頁面寫了處理請求的方法

pageload程式碼:

if (!Page.IsPostBack)
{
      ProcessRequest();
}
ProcessRequest方法:
// 獲取所有的請求資訊
            string A= Request["A"].ToString();
            string B= Request["B"].ToString();
            string C= Request["C"].ToString();
            string D= Request["D"].ToString();
            string E= Request["E"].ToString();

            // 先進行驗證
            string VE= FormsAuthentication.HashPasswordForStoringInConfigFile(A+ B+ C+ D+ E, "MD5");

            // 進行判斷是不是對的,有沒有丟資料
            if (VE== E)
            {
                // 相等,則可以進行正常操作
                // 前臺頁面的資料繫結等相關操作寫在這裡
            }
            else
            {
                // 不相等,有資料丟失,要求重新發送請求
                // 進行資料丟失處理
            }

以上方法沒有涉及json序列化和加密等相關內容,僅有一個校驗資料的過程,若有json和其他加密方式則可以獲取請求的資料流進行解析即可。

另,該方法沒有返回資料,僅限對方發來請求,接收方處理,但不返回資料或者資料返回需要以請求形式返回,這個是由於httphelper那個方法是提交形式發來的資料,如果需要直接返回則應當使用一般處理程式等其他方法。

將資料處理完成之後返回給傳送方

// 初始化
            Uri uri = new Uri("http://localhost:888/abc.aspx");// 目標地址
            HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
            request.Method = "POST";
            Encoding encoding = Encoding.GetEncoding("utf-8");

            // 開始組裝請求資料
            string A= "a";
            string B = "b";
            string C= "c";
            string D= "d";
            string E= FormsAuthentication.HashPasswordForStoringInConfigFile(A+ B+ C+ D+ "A", "MD5");
            // 把這些資料組裝成請求
            string postData = ""; // 組裝要返回的資料,如果json需要將這個在序列化一下

            byte[] byteData = encoding.GetBytes(postData);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteData.Length;
            try
            {
                using (Stream postStream = request.GetRequestStream())
                {
                    // 傳送資料,如果沒有後面被註釋掉的部分,請求會在這個方法執行完成之後再發送
                    postStream.Write(byteData, 0, byteData.Length);
                }
                //try
                //{
                //    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                //    {
                //        StreamReader reader = new StreamReader(response.GetResponseStream());
                //        string responseStr = reader.ReadToEnd();// 同理,如果是經過了序列化的流需要在這裡進行反序列化等相關操作
                //        if (responseStr != null && responseStr.Length > 0)// 返回的資料處理
                //        {
                //            // 完成
                //        }
                //        else
                //        {
                //            // 失敗
                //        }
                //    }
                //}
                //catch (WebException ee)
                //{
                //    string error = ee.Message;
                //}
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }
以上就實現了網路介面,僅僅是最基本功能,不包括序列化和加密等操作。

如果接受的是一般處理程式,程式碼也基本相同,僅僅是返回的時候進行的處理,

返回部分程式碼如下:

// 返回處理結果
                context.Response.ContentType = "application/x-www-form-urlencoded";
                context.Response.Write(postData);
該段程式碼僅僅是返回結果的型別處理,其中postData是經過處理的資料,型別與Write方法相符就行,Write方法有4個過載,支援的型別,有:char c, object obj, string s 和 char[] buffer,int index,int count,使用參考文件。

.net MVC裡面使用的是controller進行這個操作,裡面的實現方式相同。但是controller可以直接返回資料,將控制器的方法的返回型別改一下然後返回就好。

更新————————

今天用介面傳圖片的時候,雙方使用base64串進行傳輸,傳輸過程中發現圖片資料丟失,於是各種找問題,最後發現是傳輸過程中對base64進行了解密,導致的資料丟失,接收資料方那邊是直接多進行了一次解密,於是傳送方進行了URLEncode,於是該問題解決了。