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.其中,内部实际调用接口返回的结果为

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C#使用HttpWebRequest上传文件的步骤如下: 1. 创建HttpWebRequest对象,设置请求的URL和请求方法为POST。 2. 设置请求头部信息,包括Content-TypeContent-Length等。 3. 打开请求流,将文件数据写入请求流。 4. 发送请求,获取响应。 5. 关闭请求流和响应流,释放资源。 具体实现可以参考以下代码: ``` string url = "http://example.com/upload"; string filePath = "C:\\test.txt"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/octet-stream"; request.ContentLength = new FileInfo(filePath).Length; using (Stream requestStream = request.GetRequestStream()) { using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[4096]; int bytesRead = ; while ((bytesRead = fileStream.Read(buffer, , buffer.Length)) != ) { requestStream.Write(buffer, , bytesRead); } } } using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { // 处理响应 } ``` ### 回答2: C是一种编程语言,被广泛用于系统级应用程序开发,操作系统开发和网络编程等领域。C语言最早是由贝尔实验室的Dennis Ritchie在20世纪70年代初开发的。在20世纪70年代末和80年代初,C语言在操作系统开发和编译器构建广受欢迎,迅速发展为一种重要的编程语言。 C语言的特点是简单、直接、快速和高效。它被设计成一种高级的汇编语言,可以直接调用计算机底层的硬件和操作系统,同时还可以通过库函数实现高级的操作。C语言的基本数据类型包括整数、字符、浮点数和指针等。C语言的语法简单,容易学习和使用,代码的可读性很高,可以方便地修改、调试和维护。 C语言的应用领域非常广泛。它在操作系统、网络编程、游戏开发、图形处理、数据库管理、嵌入式系统、物联网和人工智能等方面都有应用。许多重要的软件都是用C语言编写的,比如Unix系统、Linux系统、MySQL数据库、Apache服务器等。 尽管C语言已经有几十年的历史,但它仍然是编程语言一个非常重要的组成部分。许多高级的编程语言(如C++和Java)都是在C语言的基础上发展而来,而C语言本身也经过了不断的更新和改进。C语言的简单、快速和高效使得它在计算机编程领域非常受欢迎,因此学习C语言是计算机科学和软件工程的必修课程之一。 ### 回答3: C是一种高级程序设计语言,它是由Dennis Ritchie在20世纪70年代期开发的,用来编写操作系统和其他底层软件。它是目前应用范围最广的编程语言之一,因为它简单、高效、可移植性强、理解容易且非常灵活。C语言不仅仅用于开发操作系统,还可以开发各种类型的软件,包括网络服务器、数据库管理系统、计算机游戏和移动应用程序等。 C语言具有很多特性,比如结构化编程、函数库支持、类型检查、动态内存分配等,可以帮助程序员更好地掌控程序的执行。C语言也支持面向对象编程,虽然不是最常见的面向对象编程语言,但在很多领域,面向对象的C语言代码仍然很常见。 在学习C语言时,需要先了解语言的基本结构和语法,理解C语言的编译器运行原理以及如何在Linux和Windows操作系统编写代码。C语言的编程练习对于提高编程能力以及理解计算机科学的基本概念非常有益。 总之,C语言是一门非常重要的编程语言,历经数十年的演进,它仍然被广泛使用于实时操作系统、嵌入式系统、网络编程和许多其他领域。学习C语言能够培养计算机编程能力,加深对计算机系统运作原理的理解,是一项非常有价值的技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值