web服务器使用System.Net.Http从远程服务器请求文件返回前端而无需在web服务器本地暂存的实现方式

  using (var httpClient = new HttpClient())
            {
                try
                {
                    ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
                    HttpResponseMessage remoteResponse = await httpClient.GetAsync(remoteUrl, HttpCompletionOption.ResponseHeadersRead);
                    remoteResponse.EnsureSuccessStatusCode(); 

                    // 设置内容类型为从远程响应中获取的类型  
                    MediaTypeHeaderValue contentType = remoteResponse.Content.Headers.ContentType;

                    // 创建一个响应消息以发送给客户端  
                    var response = Request.CreateResponse(HttpStatusCode.OK);

                    // 复制远程响应的内容到我们的响应中  
                    response.Content = new PushStreamContent(async (outputStream, httpContent, transportContext) =>
                    {
                        // 读取远程响应的内容流并写入到输出流中  
                        var buffer = new byte[65536]; // 64KB的缓冲区  
                        int bytesRead;
                        using (var streamToReadFrom = await remoteResponse.Content.ReadAsStreamAsync())
                        {
                            while ((bytesRead = await streamToReadFrom.ReadAsync(buffer, 0, buffer.Length)) != 0)
                            {
                                await outputStream.WriteAsync(buffer, 0, bytesRead);
                            }
                        }
                        // 关闭输出流
                        outputStream.Close();
                    }, contentType);

                    if (remoteResponse.Content.Headers.ContentLength.HasValue)
                    {
                        response.Content.Headers.ContentLength = remoteResponse.Content.Headers.ContentLength.Value;
                    }
                    // 设置文件下载时建议的文件名(可选)  
                    var fileName = Path.GetFileName(new Uri(remoteUrl).LocalPath);
                    if (!string.IsNullOrEmpty(fileName))
                    {
                        var contentDisposition = new ContentDispositionHeaderValue("attachment")
                        {
                            FileName = fileName
                        };
                        response.Content.Headers.ContentDisposition = contentDisposition;
                    }

                    return response;
                }
                catch (HttpRequestException e)
                {
                    return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
                }
            }

前端直接使用window.location.href重定向就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值