ASP.NET MVC生命周期中的进程缓慢

时间:2018-11-07 22:14:22

标签: asp.net-mvc performance process lifecycle

这是我的Global.asax.cs。需要注意的重要一点是,随着各种事件的执行,我只是抛出一些消息。

public class MvcApplication : System.Web.HttpApplication
{
    string file_path = "c:/temp/app.out";

    protected void Application_Start() { /* default codes here */ }

    protected void Application_BeginRequest()
    {
        File.AppendAllText(file_path, "BeginRequest starts at " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + Environment.NewLine);
    }
    protected void Application_PreRequestHandlerExecute()
    {
        File.AppendAllText(file_path, "PreRequestHandlerExecute starts at " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + Environment.NewLine);
    }
    protected void Application_PostRequestHandlerExecute()
    {
        File.AppendAllText(file_path, "PostRequestHandlerExecute starts at " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + Environment.NewLine);
    }
    protected void Application_EndRequest()
    {
        File.AppendAllText(file_path, "EndRequest starts at " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + Environment.NewLine);
    }
}

这是我的控制者。

public partial class MyController : Controller
{
    [HttpGet]  public ActionResult PlaceOrders()
    {
        System.IO.File.AppendAllText("c:/temp/app.out", "PlaceOrdersGet starts at " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + Environment.NewLine);
        // Logic here.
        return View(vm);
    }
    [HttpPost] public ActionResult PlaceOrders(Orders vm)
    {
        System.IO.File.AppendAllText("c:/temp/app.out", "PlaceOrdersPost starts at " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + Environment.NewLine);
        // Logic here.
        return PlaceOrders();
    }

}

让我感到困惑的是捕获的日志信息:

BeginRequest starts at 2018/11/08 04:21:04.900
PreRequestHandlerExecute starts at 2018/11/08 04:21:04.900
PlaceOrdersGet starts at 2018/11/08 04:21:04.900
PostRequestHandlerExecute starts at 2018/11/08 04:21:05.244
EndRequest starts at 2018/11/08 04:21:05.244

BeginRequest starts at 2018/11/08 04:24:52.391
PreRequestHandlerExecute starts at 2018/11/08 04:24:52.407
PlaceOrdersPost starts at 2018/11/08 04:24:55.110
PlaceOrdersGet starts at 2018/11/08 04:24:56.094
PostRequestHandlerExecute starts at 2018/11/08 04:24:56.438
EndRequest starts at 2018/11/08 04:24:56.438

当我对PlaceOrders()执行GET时,第一块显示PlaceOrdersGet在PreRequestHandlerExecute之后几乎立即发生。 但是,当我对PlaceOrders执行POST时,从PreRequestHandlerExecute到PlaceOrdersPost大约需要2.7秒! 这两个块之间的唯一区别是,后者返回了ViewModel,而前者则没有。

我浏览了一些网页,但找不到任何帮助来进一步深入研究此问题。我知道有一个被调用的ProcessRequest方法,但这是我所能做到的。这对整体绩效产生了严重的不利影响。

任何帮助或简单的代码可以透露更多的计时信息,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

我没有足够的声誉来发表评论,但是您的“订单”模型有多大,您在哪里使用它?如果它是一个带有集合的大型模型,并且您正在填充这些集合,那么使用JSON填充模型可能需要一段时间。据我所知,没有理由使用该模型,因为您没有在任何地方使用它。尝试在后期操作中不使用“订单”模型,看看需要多长时间。

答案 1 :(得分:1)

我想我找到了答案。是的,这里的延迟为2.7秒

PreRequestHandlerExecute starts at 2018/11/08 04:24:52.407
PlaceOrdersPost starts at 2018/11/08 04:24:55.110

确实是由于模型绑定!

解决方案是对自己进行模型绑定...

我只是从以下位置修改了我的HttpPost操作

[HttpPost] public ActionResult PlaceOrders(Orders vm)
{
    System.IO.File.AppendAllText("c:/temp/app.out", "PlaceOrdersPost starts at " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + Environment.NewLine);
    // Logic here.
    return PlaceOrders();
}

到以下:

[HttpPost] public ActionResult PlaceOrders(FormCollection fc)
{
    System.IO.File.AppendAllText("c:/temp/app.out", "PlaceOrdersPost starts at " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + Environment.NewLine);

    var vm = new Orders();
    // Assign fc to vm here.
    // Logic here.
    return PlaceOrders();
}

这是我得到的日志:

PreRequestHandlerExecute starts at 2018/11/08 13:27:09.088
PlaceOrdersPost starts at 2018/11/08 13:27:09.106

从PreRequestHandlerExecute到PlaceOrdersPost的延迟现在至少可以忽略不计。