gpt4 book ai didi

asp.net-mvc-3 - 并发请求时的 ASP.NET(或 IIS?)行为

转载 作者:行者123 更新时间:2023-12-03 03:20:27 25 4
gpt4 key购买 nike

我正在使用 ASP.NET MVC3 开发 Web 服务。HTTP API 的方法之一从 POST 请求正文接收图像,并需要将其存储在磁盘上以供进一步处理。方法的开头是这样的:

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

Interlocked.Increment(ref _generateCount);

byte[] fileBuffer;
using (Stream inputStream = Request.InputStream)
{
if (inputStream.Length == 0)
{
Trace.WriteLine("Submitted file is empty", "Warning");
inputStream.Close();
Interlocked.Decrement(ref _generateCount);
return new HttpStatusCodeResult(400, "Content is empty");
}

fileBuffer = new byte[inputStream.Length];
inputStream.Read(fileBuffer, 0, (int)inputStream.Length);
inputStream.Close();
}
stopwatch.Stop()
... (storing the fileBuffer on disk & quite CPU intensive processing on the file)

我在一个小型 Azure 实例中托管该服务。

现在,我的奇怪行为是当我向服务发出并行请求时。假设我发出第一个请求,5 秒后发出第二个请求。如您所见,我正在使用秒表来监控性能。对于第一个请求,ElapsedTime 将非常小(小于一秒),但对于第二个请求,它通常读取大约。 14秒!

请注意,单个请求的平均处理时间约为。 25 秒(当处理多个请求时会达到 40 秒以上),因此我在 14 秒后读取输入流,尽管第一个请求尚未完成。

我该如何解释这种延迟?

谢谢

最佳答案

如果您的最终目标是将文件存储在磁盘上,为什么要将其加载到内存中?您可以直接写入输出流:

public ActionResult SomeAction()
{
    var stopwatch = Stopwatch.StartNew();
if (Request.InputStream.Length == 0)
{
return new HttpStatusCodeResult(400, "Content is empty");
}

var filename = Server.MapPath("~/app_data/foo.dat");
using (var output = System.IO.File.Create(filename))
{
Request.InputStream.CopyTo(output);
}
stopwatch.Stop();

...
}

另请注意,如果您发出 2 个并发请求尝试写入服务器上的同一文件,则可能会收到损坏的数据或错误,因为您无法同时写入同一文件。

关于asp.net-mvc-3 - 并发请求时的 ASP.NET(或 IIS?)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9850335/

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