gpt4 book ai didi

c# - ASP.NET Web API 2 - StreamContent 非常慢

转载 作者:IT王子 更新时间:2023-10-29 04:54:22 24 4
gpt4 key购买 nike

我们已将一个项目从 WCF 移植到 Web API (SelfHost),在此过程中,我们注意到在提供 Web 应用程序时速度大幅下降。现在是 40-50 秒,而之前是 3 秒。

我通过使用以下 Controller 为 AspNet.WebApi 和 OwinSelfHost 添加各种 Nuget 包,在一个简单的控制台应用程序中重现了该问题:

var stream = new MemoryStream();
using (var file = File.OpenRead(filename))
{
file.CopyTo(stream);
}
stream.Position = 0;

var response = Request.CreateResponse(System.Net.HttpStatusCode.OK);

/// THIS IS FAST
response.Content = new ByteArrayContent(stream.ToArray());
/// THIS IS SLOW
response.Content = new StreamContent(stream);

response.Content.Headers.ContentType = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(filename));
response.Content.Headers.ContentLength = stream.Length;

正如您从代码中看到的,唯一的区别是 StreamContent (slooooow) 与 ByteArrayContent 的用法。

该应用程序托管在 Win10 机器上,可从我的笔记本电脑访问。Fiddler 显示使用 StreamContent 从服务器获取单个 1MB 文件到我的笔记本电脑需要 14 秒,而 ByteArrayContent 不到 1 秒。

另请注意,完整的文件被读入内存以表明唯一的区别是所使用的内容类。

奇怪的是,传输本身似乎很慢。服务器快速/立即响应 header ,但数据需要很长时间才能到达,如 Fiddler 计时信息所示:

GotResponseHeaders: 07:50:52.800
ServerDoneResponse: 07:51:08.471

完整的时间信息:

== TIMING INFO ============
ClientConnected: 07:50:52.238
ClientBeginRequest: 07:50:52.238
GotRequestHeaders: 07:50:52.238
ClientDoneRequest: 07:50:52.238
Determine Gateway: 0ms
DNS Lookup: 0ms
TCP/IP Connect: 15ms
HTTPS Handshake: 0ms
ServerConnected: 07:50:52.253
FiddlerBeginRequest:07:50:52.253
ServerGotRequest: 07:50:52.253
ServerBeginResponse:07:50:52.800
GotResponseHeaders: 07:50:52.800
ServerDoneResponse: 07:51:08.471
ClientBeginResponse:07:51:08.471
ClientDoneResponse: 07:51:08.471

Overall Elapsed: 0:00:16.233

有谁知道幕后发生的事情可以解释行为的差异?

最佳答案

OWIN 自托管问题的解决方案是 StreamContent 缓冲区大小。 StreamContent 的默认构造函数使用默认值 0x1000,4Kb。在千兆位网络上,传输 26Mb 文件需要大约 7 分钟才能完成,传输速率约为 60Kb/s。

 const int BufferSize = 1024 * 1024;
responseMessage = new HttpResponseMessage();
responseMessage.Content = new StreamContent(fileStream, BufferSize);

现在将 bufferSize 修改为 1Mb 只需几秒钟即可完成下载。

[编辑] 根据 this link,在 StreamContent SerializeToStreamAsync 中执行 StreamToStreamCopy性能会有所不同。一个合适的值可能是 80K。

关于c# - ASP.NET Web API 2 - StreamContent 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32992081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com