C#中HttpWebRequest上传文件请求转发与WebResponse响应解析

本文介绍了一个文件上传Web API的设计与实现细节,通过转发请求至后端服务并处理返回结果,最终将数据以指定格式返回给客户端。文章展示了如何处理HTTP请求、构造请求内容及解析返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对外暴露一个上传文件的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.其中,内部实际调用接口返回的结果为

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值