什么[ASP.net] MVC在我的控制器之前做什么?

时间:2014-01-08 17:28:23

标签: c# .net asp.net-mvc performance mvc-mini-profiler

我的MVC控制器出现了一些奇怪的性能问题,或者更确切地说是之前的问题?

根据Mini Profiler输出,在到达我的控制器之前有120ms的开销。

有谁知道为什么会这样?这是在设置Compilation debug=false的服务器(非本地)上进行的,因此不存在未在release模式下运行的问题。

之后的一切,我可以调整/修改,但在此之前?我迷路了..

思想??

enter image description here

更新

经过一些性能工具后,我遇到了enter link description here& enter link description here导致以下内容:

  

最昂贵的筹码   ------------------------------------ System.Web.HttpApplication + CallHandlerExecutionStep.System.Web.HttpApplication。 IExecutionStep.Execute   System.Web.HttpApplication.ExecuteStep   System.Web.HttpApplication + PipelineStepManager.ResumeSteps   System.Web.HttpApplication.BeginProcessRequestNotification   System.Web.HttpRuntime.ProcessRequestNotificationPrivate   System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper   System.Web.Hosting.PipelineRuntime.ProcessRequestNotification   System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion   System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper   System.Web.Hosting.PipelineRuntime.ProcessRequestNotification   ===>费用(1716011)

     

Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp   Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp   Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp   Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp   Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp   Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp   Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp   Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp   Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp   Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp   Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp   Microsoft.Practices.Unity.UnityContainer.DoBuildUp   Microsoft.Practices.Unity.UnityContainer.DoBuildUp   System.Web.Mvc.DefaultControllerFactory + DefaultControllerActivator.Create   System.Web.Mvc.DefaultControllerFactory.CreateController   System.Web.Mvc.MvcHandler.ProcessRequestInit   System.Web.Mvc.MvcHandler + LT;> c__DisplayClass6.b__2   System.Web.Mvc.SecurityUtil + LT;> c__DisplayClassb`1.b__a   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust   System.Web.HttpApplication + CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute   System.Web.HttpApplication.ExecuteStep   System.Web.HttpApplication + PipelineStepManager.ResumeSteps   System.Web.HttpApplication.BeginProcessRequestNotification   System.Web.HttpRuntime.ProcessRequestNotificationPrivate   System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper   System.Web.Hosting.PipelineRuntime.ProcessRequestNotification   System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion   System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper   System.Web.Hosting.PipelineRuntime.ProcessRequestNotification   ===>费用(936006)

     

Microsoft.Win32.Win32Native.CoCreateGuid   StackExchange.Profiling.Timing..ctor   StackExchange.Profiling.MVCHelpers.ProfilingViewEngine.Find   System.Web.Mvc.ViewEngineCollection + LT;> c__DisplayClassc.b__a   System.Web.Mvc.ViewEngineCollection.Find   System.Web.Mvc.ViewEngineCollection.Find   System.Web.Mvc.ViewResult.FindView   System.Web.Mvc.ViewResultBase.ExecuteResult   System.Web.Mvc.ControllerActionInvoker + LT;> c__DisplayClass1c.b__19   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters   System.Web.Mvc.ControllerActionInvoker.InvokeAction   System.Web.Mvc.Controller.ExecuteCore   System.Web.Mvc.ControllerBase.Execute   System.Web.Mvc.MvcHandler + LT;> c__DisplayClass6 + LT;> c__DisplayClassb.b__5   System.Web.Mvc.Async.AsyncResultWrapper + LT;> c__DisplayClass1.b__0   System.Web.Mvc.MvcHandler + LT;> c__DisplayClasse.b__d   System.Web.HttpApplication + CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute   System.Web.HttpApplication.ExecuteStep   System.Web.HttpApplication + PipelineStepManager.ResumeSteps   System.Web.HttpApplication.BeginProcessRequestNotification   System.Web.HttpRuntime.ProcessRequestNotificationPrivate   System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper   System.Web.Hosting.PipelineRuntime.ProcessRequestNotification   System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion   System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper   System.Web.Hosting.PipelineRuntime.ProcessRequestNotification   ===>费用(780005)

团结会导致一些问题吗?

2 个答案:

答案 0 :(得分:1)

您应该查看The ASP.NET MVC Pipeline

ASP.NET MVC管道可以分为以下几部分 -

  • App initialisation - 在此方法中,您可以将Route对象添加到静态RouteTable.Routes集合(其类型为RouteCollection)。

  • Routing Part - 路由模块尝试匹配传入的URL 路由表,并调用相应的IRouteHandler。

  • Controller creation - IControllerFactory创建一个实例 控制器基于路由参数和默认命名 约定。

  • Action Execution - IActionInvoker识别方法 执行后,IModelBinder验证并绑定方法参数 并且IFilterProvider发现要应用的过滤器。那个行动 返回一个ActionResult类型。

  • View - IViewEngine实例化正确的视图引擎和 model被传递给视图。使用模型验证提供程序, 检索验证规则以创建客户端验证 脚本以及远程验证脚本

了解更多信息:

http://blog.stevensanderson.com/2007/11/20/aspnet-mvc-pipeline-lifecycle/

答案 1 :(得分:0)

我很抱歉我的英文

有很多
1.Application_BeginRequest(和AuthenticateRequest)在全局或一些HttpModule中 2.filters
3.mvc框架,控制器工厂,动作调用器等 4.第一次运行时,将il编译为本机

需要花费很多

我认为您可以使用秒表来检查您的操作代码花费的时间 这样你就可以找出需要花费很多时间的地方

120ms不是跑步前花费的时间,我认为是行动完成的时间

顺便说一下120ms也不算太糟糕

更新

public ActionResult Index()
{
    var profiler = MiniProfiler.Current;
    using (profiler.Step("action"))
    {
        return View();
    }
}

enter image description here
这张照片高于代码运行结果 所以你可以看到 行动是一个孩子只需花费1.9
和http:// ......成本302,它包括控制器,动作

所以你应该检查你的动作代码或动作代码之外的大部分时间成本
在图片中,因为它是第一次运行所以花费300+,第二次运行只需花费4 第一次运行必须很慢