IIS中大型流的Asp.Net WebApi StreamContent性能

IIS中大型流的Asp.Net WebApi StreamContent性能,iis,amazon-s3,asp.net-web-api,Iis,Amazon S3,Asp.net Web Api,我一直在开发一个IIS托管的WebApi服务,它从S3(通过HttpWebRequest)流式传输文件,并通过StreamContent从控制器返回文件。对于更大的文件,大约50mb,我们会看到高CPU峰值。下面是一个动作片段 public async Task<HttpResponseMessage> Get(Guid id) { var stream = await GetResponseStreamFromS3(id); var response = Requ

我一直在开发一个IIS托管的WebApi服务,它从S3(通过HttpWebRequest)流式传输文件,并通过StreamContent从控制器返回文件。对于更大的文件,大约50mb,我们会看到高CPU峰值。下面是一个动作片段

public async Task<HttpResponseMessage> Get(Guid id)
{
    var stream = await GetResponseStreamFromS3(id);

    var response = Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StreamContent(stream);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = doc.FileName };
    response.Content.Headers.ContentLength = streamAndLength.Length;

    return response;
}
公共异步任务获取(Guid id)
{
var stream=await GetResponseStreamFromS3(id);
var response=Request.CreateResponse(HttpStatusCode.OK);
response.Content=新的流内容(stream);
response.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/八位字节流”);
response.Content.Headers.ContentDisposition=新ContentDispositionHeaderValue(“附件”){FileName=doc.FileName};
response.Content.Headers.ContentLength=streamAndLength.Length;
返回响应;
}

深入到StreamContent中,在Stream.copytosync调用过程中似乎出现了峰值。有没有关于它为什么会导致峰值以及如何减轻峰值的想法?

这里可能会发生很多事情。看看这篇文章,了解一些想法,删除设置contentlength的代码。这是根据输入流是否可以搜索自动完成的。嗯,我一直在使用PushStreamContent,与stream.CopyTo和更大的缓冲区配合使用。数字明显更好。我想知道是异步支持造成了这么多的延迟,因为使用vanilla StreamContent或使用CopyToAsync的PushStreamContent会产生相同的结果。你看到这个问题了吗:我怀疑你的内容正在服务器上缓冲。是的,我读过那篇文章,我通过IHostBufferPolicySelector明确地为上传和下载设置缓冲,并直接在HttpWebRequest上设置。我没有上传大文件的问题,只是出于某种原因下载。