Подтвердить что ты не робот

Запрос результатов MvcMiniProfiler, дающий 404 в приложении Asp.Net MVC

Я пытаюсь использовать MvcMiniProfiler в моем приложении ASP.NET MVC. Я установил последний пакет NuGet и добавил весь код с вики-страницы в Application_BeginRequest(), Application_AuthenticateRequest() и на мой взгляд.

При загрузке страницы все файлы javascript мини-профайлера включены и правильно загружаются с сервера, но когда он пытается получить результаты, Chrome показывает:

GET http://localhost:59269/mini-profiler-results?id=59924d7f-98ba-40fe-9c4a-6a163f7c9b08&popup=1 404 (Not Found)

Я предполагаю, что это связано с тем, что никакие маршруты не устанавливаются с помощью MVC, чтобы разрешить /mini-profiler-results, однако я не могу найти способ сделать это. Посмотрев на кодовой странице Google, их файл Global.asax.cs их примерного приложения прошел несколько изменений, один раз используя MvcMiniProfiler.MiniProfiler.RegisterRoutes(), второй - с помощью MvcMiniProfiler.MiniProfiler.Init() и третий стиль, который ничего не делает. Ранее упомянутых двух функций не существует, поэтому я предполагаю, что они были поэтапно отменены.

В этот момент я не знаю, как я могу исправить эту ошибку и использовать профилировщик в своем приложении. Любые идеи?


Мой файл Global.Asax.cs выглядит так:

public class Global : System.Web.HttpApplication
{
    protected void Application_BeginRequest()
    {
        MvcMiniProfiler.MiniProfiler.Start();
    }

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        // Only show profiling to admins
        if (!Roles.IsUserInRole(Constants.AdminRole))
            MvcMiniProfiler.MiniProfiler.Stop(discardResults: true);
    }

    protected void Application_Start(object sender, EventArgs e)
    {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");

        routes.MapRoute(
        "Default",
            // Route name
        "{controller}/{action}/{id}",
            // URL with parameters
        new { controller = "Home", action = "Index", id = "" }
            // Parameter defaults
        );
    }
}
4b9b3361

Ответ 1

Метод RegisterRoutes() теперь вызывается автоматически (и с соответствующими блокировками записи и т.д.) статическим конструктором, который, в свою очередь, должен вызываться при первом вызове MiniProfiler.Start(). Это должно вводить маршруты в таблицу маршрутов.

Итак, если вы явно не очистите таблицу маршрутов в какой-то момент после того, как вы впервые коснулись профилировщика, он должен (при равных условиях) работать.

Интересно, является ли это проблемой безопасности. Например, с какой версией IIS вы работаете? В некоторых конфигурациях (в частности, IIS6) путь должен быть распознан сервером, или вам нужно включить подстановочный знак. Если это так, пожалуйста, дайте мне знать - возможно, мы сможем реализовать какой-то резервный маршрут в ashx или что-то в этом роде.


Обновление: проблема в том, что вы не сохраняете результаты в конце запроса; существует как краткосрочное, так и долгосрочное хранилище, и обе имеют стандартные реализации - все, что вам нужно сделать, это что-то вроде:

protected void Application_EndRequest(object sender, EventArgs e)
{
    MiniProfiler.Stop(discardResults: !IsAnAdmin());
}

Обновить обновление: вам также может потребоваться добавить следующее в web.config в разделе <system.webServer>, <handlers>:

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