1. 程式人生 > >C#中HttpWebRequest上傳檔案請求轉發與WebResponse響應解析

C#中HttpWebRequest上傳檔案請求轉發與WebResponse響應解析

對外暴露一個上傳檔案的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.其中,內部實際呼叫介面返回的結果為