MVC Mini Profiler includes not respecting applicat

2019-04-05 02:39发布

问题:

I've got the MVC Mini Profiler set up as described on its project page, and the includes are indeed being written on the page.

Problem is, my application sits at http://localhost:8080/web, and the markup written by the profiler includes looks like this:

<link rel="stylesheet/less" type="text/css" href="/mini-profiler-includes.less?v=2.0.4177.17902">
<script type="text/javascript" src="/mini-profiler-includes.js?v=2.0.4177.17902"></script>
<script type="text/javascript"> jQuery(function() { MiniProfiler.init({ id:'fb4dc30e-c1aa-4be6-902c-ef2812dd1fe2', renderDirection:'left' }); } ); </script>

These all of course give 404 errors, but if I navigate to /web/mini-profiler-includes.less?, it loads fine.

The source that creates that string can be found here:

// MiniProfilerHandler.cs
/// <summary>
/// Understands how to route and respond to MiniProfiler UI urls.
/// </summary>

public class MiniProfilerHandler : IRouteHandler, IHttpHandler
{
    internal static HtmlString RenderIncludes(MiniProfiler profiler, RenderPosition? position = null, bool showTrivial = false, bool showTimeWithChildren = false)
    {
        const string format =
            @"<link rel=""stylesheet/less"" type=""text/css"" href=""{0}mini-profiler-includes.less?v={1}"">
            <script type=""text/javascript"" src=""{0}mini-profiler-includes.js?v={1}""></script>
            <script type=""text/javascript""> jQuery(function() {{ MiniProfiler.init({{ id:'{2}', path:'{0}', renderDirection:'{3}', showTrivial: {4}, showChildrenTime: {5} }}); }} ); </script>";

        var pos = position ?? (MiniProfiler.Settings.RenderPopupButtonOnRight ? RenderPosition.Right : RenderPosition.Left);

        var result = profiler == null ? "" : string.Format(format,
                                                       EnsureEndingSlash(HttpContext.Current.Request.ApplicationPath),
                                                       MiniProfiler.Settings.Version,
                                                       profiler.Id,
                                                       pos.ToString().ToLower(),
                                                       showTrivial ? "true" : "false",
                                                       showTimeWithChildren ? "true" : "false");

        return new HtmlString(result);
    }

    // rest of the code
}

Why isn't Request.ApplicationPath returning my application's path? Am I doing something wrong, or should I file an issue on the mvc-mini-profiler page?

EDIT: To make things even weirder, I put a breakpoint on the MiniProfiler.RenderIncludes() call, and checked what the value of HttpContext.Current.Request.ApplicationPath was at that moment, and it was "/web"! Very mysterious.

EDIT 2: Looks like they may have added support for virtual paths in the latest version (2 hours ago :)), and the NuGet package (which is how I installed it) is not completely up to date. Investigating...

回答1:

Pulling the latest source (this commit being the most recent at time of this post), building the project, grabbing the DLL and referencing that instead of using the project's NuGet package fixed the problem.

EDIT: As of right now, the NuGet package is now up to date with the latest commit, so NuGet away!