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

Asp.net mvc ASP.NET MVC生命周期中的缓慢进程,asp.net-mvc,performance,process,lifecycle,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_

这是我的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发布时,从PreRequestHandlerExecute到PlaceOrdersPost几乎需要2.7秒! 这两个块之间唯一的区别是后者返回了ViewModel,而前者没有

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


任何帮助或简单的代码泄漏出更多的时间信息将不胜感激

我没有足够的声誉发表评论,但您的订单模型有多大?您在哪里使用它?如果它是一个包含集合的大型模型,并且您正在填充这些集合,那么模型可能需要一段时间才能填充JSON。就我所知,没有理由使用这种模式,因为你没有在任何地方使用它。试着在你的post操作中不使用订单模式,看看需要多长时间。

我想我已经找到了答案。是的,这里延迟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的延迟可以忽略不计。

订单模型实际上有几个列表。这不是一个购物车的东西,而是一个允许父子项目。我忽略了业务逻辑,因为它在这里有点无关紧要。无论如何,如果有办法知道“反序列化”模型需要多长时间,我很乐意知道。你的回答促使我重新检查模型,我已经移除了一些遗留问题。时间安排确实有所改善。但是,它仍然持续达到2.4到2.6秒。这将是我的下一个建议,尝试自己反序列化模型。很高兴你让它工作了。对不起,回复太慢了,这几天我病了。