C#中HttpWebRequest上傳檔案請求轉發與WebResponse響應解析
阿新 • • 發佈:2019-01-09
對外暴露一個上傳檔案的WebAPI給第三方使用,實現層面上,本質上是將請求轉發到另外一個WebService,並處理它返回的結果,構造成指定的格式返回給第三方。
看程式碼:
/// <summary> /// 測試:檔案上傳 /// </summary> /// <returns></returns> [System.Web.Mvc.HttpPost] public IHttpActionResult Send() { //處理接收到的請求,解析請求內容與大小 var curRequest = HttpContext.Current.Request; byte[] inputBytes; int inputStreamLength; using (var inputStream = curRequest.InputStream) { inputStreamLength = Convert.ToInt32(inputStream.Length); inputBytes = new byte[inputStreamLength + 1]; inputStream.Read(inputBytes, 0, inputStreamLength); inputStream.Close(); } //構造真正的請求 //請求方式為POST,請求內容格式、內容與接收到的請求保持一致 var request = (HttpWebRequest)WebRequest.Create("http://172.16.50.135:8888/Projects/Common/Mobile/ReceiveUploadFile.aspx"); request.Method = "POST"; request.ContentType = curRequest.ContentType; request.ContentLength = curRequest.ContentLength; using (var requestStream = request.GetRequestStream()) { requestStream.Write(inputBytes, 0, inputStreamLength); requestStream.Close(); } //獲取請求返回響應結果 var response = request.GetResponse(); //處理返回結果 var sResult = ""; var responseStreamLength = Convert.ToInt32(response.ContentLength); //返回結果為空時,構造提示失敗 if (responseStreamLength <= 0) return Json(new { code = 400, desc = "失敗", data = sResult }); //返回結果不為空時,解析結果 using (var responseStream = response.GetResponseStream()) { var responseBytes = new byte[responseStreamLength]; if (responseStream != null) { responseStream.Read(responseBytes, 0, responseStreamLength); responseStream.Close(); } //請位元組陣列轉為字串 sResult = Encoding.ASCII.GetString(responseBytes); } //返回成功訊息 return Json(new {code = 200, desc = "成功", data = sResult.Replace(" ", "")}); }
技術關鍵點:
1.從呼叫我們真正對外暴露的介面中獲取請求上下文,包括請求內容、格式、大小等
2.構造實際的請求,包括請求地址、方式等,且請求格式、內容、大小均從對外暴露的介面中解析獲得並賦值
3.獲取實際請求結果時,能將有價值的內容從ANSI陣列轉換成字串格式
測試:
1.我們在Fiddler中構造請求,呼叫我們對外暴露的介面
2.執行請求,正常返回結果
3.其中,內部實際呼叫介面返回的結果為