Owin服务在Windows服务中自托管时以极小的块返回数据

时间:2015-12-22 21:46:45

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

我有一个使用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

1 个答案:

答案 0 :(得分:0)

.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);