【问题标题】:Owin service returning data in extremely small chunks when self hosted in windows service在 Windows 服务中自托管时,Owin 服务以极小的块返回数据
【发布时间】:2016-03-29 06:08:54
【问题描述】:

我有一个使用 Owin 的自托管 ASP.NET Web Api 项目,我无法弄清楚为什么响应似乎需要很长时间才能获得响应。我看到 600KB 的数据需要 20 秒以上的时间。为了测试它不是机器,我制作了一个快速节点/快速应用程序,它返回相同的数据并部署它,并且需要几毫秒来获取数据。在 Chrome devtools 中,我可以看到 WebApi 响应一次下载千字节,奇怪的是,它似乎每次总是 4KB,而节点服务似乎可以一次获取所有内容。我不知所措。我已经为此奋斗了好几天了。这两个响应具有相同的标题、相同的数据、相同的所有内容。为什么 WebApi 似乎想给我一些难以置信的小数据。

编辑

我们运行我们的 OWIN Web Api 应用程序是 Windows 服务。看来我们选择返回数据的方式导致了问题

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes(data)));
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

return result;

默认流大小似乎是 4KB

【问题讨论】:

  • 您需要创建一个Minimal, Complete, and Verifiable example 来说明您要执行的操作。由此,人们可以告诉你你做错了什么。
  • @vendettamit 我知道我在这里发的不够多。我什至不知道要发布什么,我一直在寻找任何东西,但我认为我的朋友只是为我指明了正确的方向。

标签: c# asp.net-web-api owin


【解决方案1】:

.NET 流是性能问题的原因。我的伙伴向我指出了 4KB 的块大小,所以我去寻找任何可能默认为 4KB 的东西,果然是 StreamContent 我们的 WebApi 控制器返回这样

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes(data)));
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

return result;

StreamContent 的默认缓冲区大小为 4096。通过将缓冲区增加到更大的值(例如 1MB),这可能太大了,应该是 256KB 或 512KB 之类的值,性能非常好。

result.Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes(response.jsonString)), 1000000);

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多