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重定向就可以了