小编Tom*_*myN的帖子

ASP.NET Web API 2 - StreamContent非常慢

我们已经将一个项目从WCF移植到Web API(SelfHost),在此过程中我们注意到在提供Web应用程序时出现了巨大的减速.现在40-50秒vs 3秒之前.

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

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;
Run Code Online (Sandbox Code Playgroud)

从代码中可以看出,唯一的区别是StreamContent(slooooow)与ByteArrayContent的使用.

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

另请注意,将完整文件读入内存以显示唯一的区别是使用的Content类.

奇怪的是,它的转移本身似乎很慢.服务器快速/立即响应标头,但数据需要很长时间才能到达,如Fiddler定时信息所示:

GotResponseHeaders: 07:50:52.800
ServerDoneResponse: 07:51:08.471
Run Code Online (Sandbox Code Playgroud)

完成时间信息:

== 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: …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-web-api

17
推荐指数
2
解决办法
5271
查看次数

标签 统计

asp.net ×1

asp.net-web-api ×1

c# ×1