Using MiniProfiler with MVC 5

2019-02-06 02:45发布

Edit Got the answer here

So I wanted to check out MiniProfiler to troubleshoot some performance issues. Before using it on production code I wanted to try it out with the a sample so went ahead with creating a MVC 5 application. This is plain vanilla app that gets created with the template.

Added this code in the Index() method of HomeController:

var profiler = MiniProfiler.Current;
        using (profiler.Step("Set page title"))
        {
            ViewBag.Title = "Home Page";
        }
        using (profiler.Step("Doing complex stuff"))
        {
            using (profiler.Step("Step A"))
            { // something more interesting here
                Thread.Sleep(100);
            }
            using (profiler.Step("Step B"))
            { // and here
                Thread.Sleep(250);
            }
        }
        return View();

Added this line below the jquery bundle in _Layout:

@Scripts.Render("~/bundles/jquery")
@StackExchange.Profiling.MiniProfiler.RenderIncludes()

@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)

Ran the app. Nothing shows up. No profiling, nothing.

What am I missing?

Regards.

2条回答
Evening l夕情丶
2楼-- · 2019-02-06 03:00

This is what I had to do to get MiniProfiler working in my ASP.NET MVC5 project:

  1. Installed the MiniProfiler and MiniProfiler.MVC4 NuGet packages (the MVC4 package supports MVC5)

  2. Add the following to Application_Start() in Global.asax:

    protected void Application_Start()
    {
        ...
        // Setup profiler for Controllers via a Global ActionFilter
        GlobalFilters.Filters.Add(new ProfilingActionFilter());
    
        // initialize automatic view profiling
        var copy = ViewEngines.Engines.ToList();
        ViewEngines.Engines.Clear();
        foreach (var item in copy)
        {
            ViewEngines.Engines.Add(new ProfilingViewEngine(item));
        }
    }
    
  3. Add the following to 'Application_BeginRequest()' and 'Application_EndRequest()', also in Global.asax:

    protected void Application_BeginRequest()
    {
        if (Request.IsLocal)
        {
            MiniProfiler.Start();
        }
    }
    
    protected void Application_EndRequest()
    {
        MiniProfiler.Stop();
    }
    
  4. Add the following to _Layout.cshtml (just before the </body> tag):

        ...
        @StackExchange.Profiling.MiniProfiler.RenderIncludes()
    </body>
    </html>
    
  5. Add the following to the <handlers> section of Web.config:

    <system.webServer>
        ...
        <handlers>
            ...
            <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*"
                 type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified"
                 preCondition="integratedMode" />
            ...
        </handlers>
    </system.webServer>
    

That was enough to profile each of the MVC Controller Actions and Views.


In my particular project I was using Entity Framework 6, so I also did the following:

a) Installed the MiniProfiler.EF6 package

b) Added the following to the end of Application_Start() in Global.asax:

    ...
    MiniProfilerEF6.Initialize();
}
查看更多
甜甜的少女心
3楼-- · 2019-02-06 03:22

Also you have to add call:

MiniProfiler.Start();

In Global.asax.cs to Application_BeginRequest event.

And:

MiniProfiler.Stop();

In Global.asax.cs to Application_EndRequest event.

查看更多
登录 后发表回答