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

Posted

技术标签:

【中文标题】[ASP.net]MVC 在我的控制器之前做啥?【英文标题】:Whats [ASP.net]MVC doing BEFORE my controller?[ASP.net]MVC 在我的控制器之前做什么? 【发布时间】:2014-01-08 17:28:22 【问题描述】:

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

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

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

它之后的所有内容,我都可以调整/修改,但在它之前呢?我迷路了..

想法??

更新

经过一些性能工具后,我遇到了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+c__DisplayClass6.b__2 System.Web.Mvc.SecurityUtil+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+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+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+c__DisplayClass6+c__DisplayClassb.b__5 System.Web.Mvc.Async.AsyncResultWrapper+c__DisplayClass1.b__0 System.Web.Mvc.MvcHandler+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)

团结会导致一些问题吗?

【问题讨论】:

这种延迟是否也发生在其他控制器上,还是只有这个有延迟? 它只发生在这个特定的控制器上,我的另一个控制器调用相同的 BL(和其他周围的逻辑)要快得多! 我明白了......我期望一个一致的行为,并打算指向服务器本身,但现在我不知所措 唯一的一致性是它总是那个控制器方法.. 【参考方案1】:

你应该看看The ASP.NET MVC Pipeline

ASP.NET MVC Pipeline 可以分为以下几个部分 -

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

Routing Part – 路由模块尝试将传入的 URL 与 路由表,并调用对应的IRouteHandler。

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

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

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

更多信息:

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

【讨论】:

你认为可能是 Unity 造成了一些问题吗?【参考方案2】:

对不起我的英语

有很多 1.Application_BeginRequest(和AuthenticateRequest)在全局或者一些HttpModule 2.过滤器 3.mvc框架、控制器工厂、动作调用器等 4.第一次运行时,编译il到native要花很多钱

我认为您可以使用秒表来检查您的操作中的代码花费了多少时间 这样您就可以找出需要花费大量时间的点在哪里

120ms 不是运行动作之前花费的时间,我认为是动作完成的时间

顺便说一下120ms也不错

更新

public ActionResult Index()

    var profiler = MiniProfiler.Current;
    using (profiler.Step("action"))
    
        return View();
    

这张图片在代码运行结果之上 所以你可以看到 行动是一个孩子只有成本 1.9 和 http://...... cost 302,它包括控制器,动作

所以您应该检查您的操作代码内部或您的操作代码之外的大部分时间成本 在图片中,它花费 300+,因为它是第 1 次运行,第 2 次运行仅花费 4 第一次运行一定很慢

【讨论】:

正如分析器显示的那样,这发生在我的代码之前,所以我不能秒表。 不——这不是第一次运行,问题不是我的操作代码,正如你从我的图片中看到的那样,我的代码在 20 毫秒时运行得很好,问题是 HTTP .

以上是关于[ASP.net]MVC 在我的控制器之前做啥?的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core MVC 不加载视图

文件/图像上传后 ASP.NET 3.0 mvc 应用程序崩溃

如何在我的实体框架和 ASP.NET MVC 项目中重构 connectionString?

ASP.NET MVC 动态模型未被识别

为啥 Asp.Net MVC 不在我的共享目录中搜索视图?

我在 asp.net MVC 中进行会话处理它在查看页面按钮上工作我无法在我的控制器中的另一个操作上获得会话 [重复]