.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,於是該問題解決了。