ASP.NET MVC高延迟-由于写入大文件,ajax请求与操作调用之间的延迟

时间:2019-04-15 14:52:22

标签: c# asp.net asp.net-mvc

更新2019-04-24

问题TL; DR一个控制器调用导致接下来的几个调用到达控制器之前有大约15s的延迟。

我将原因缩小为请求中写入大文件,从而导致进一步延迟File.WriteAllText(htmlFilePath, reportHTML);

原始帖子

问题

我有一个运行时间很长的控制器请求,用于生成报告。生成报告后,还会发出其他http请求以获取生成的图像。

但是,对图像的http调用在浏览器中的ajax调用与调用控制器动作之间大约需要15秒钟的时间。之后,该方法将快速运行。

到目前为止的证据

以前,我们使用WCF在另一台计算机上运行报告生成,并且没有这种延迟。 我尝试在自己的线程上(但在同一台计算机上)将报告生成和图像检索方法作为异步调用运行。但是,这仍然有延迟。

延迟也仅在生成报告后发生在第一个图像请求上。之后,就没有延迟了。

也没有会话状态,disabling session state也没有作用

询问

有人知道什么可能导致此延迟吗?如何才能更好地了解ASP.NET代码或IIS进程中的块?

其他详细信息:

使用CoreHtmlToImage生成报告,并使用Azure存储模拟器存储图像。 ASP.NET MVC是版本5.2.3(不是核心)

1 个答案:

答案 0 :(得分:0)

事实证明,写入网站目录会导致网络服务器重新启动网站

来源:Creating temporary files in wwroot folder ASP.Net MVC3

因此,如果您使用程序集工作目录(例如,

var uriAssemblyPath = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
var assemblyPath = new Uri(uriAssemblyPath).LocalPath;
var baseDirectory = System.IO.Path.GetDirectoryName(assemblyPath);

您会遇到这个问题。

如果您需要在Webroot之外的目录,则可以使用指定的temp目录

Path.GetTempPath()

来源:Where can I write a temp file from ASP.NET?