我正在尝试在我的Asp.Net MVC应用程序中使用MvcMiniProfiler。我安装了最新的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
);
}
}
答案 0 :(得分:22)
静态构造函数现在自动调用RegisterRoutes()
方法(并使用适当的写锁等),当您第一次调用MiniProfiler.Start()
时,应该调用该方法。这应该将路由注入路由表。
因此,除非您在之后的之后明确清除路由表,否则您首先触摸了探查器, (所有条件相同)都可以正常工作。
我想知道这是否属于安全问题。例如,您运行的是哪个版本的IIS?在某些配置(特别是IIS6)中,路径需要由服务器识别,或者您需要启用通配符。如果是这种情况,请告诉我 - 也许我们可以实施某种后备路线到ashx或其他什么。
更新:问题是您在查询结束时保存结果;有短期和长期存储,并且都提供了默认实现 - 您需要做的就是:
protected void Application_EndRequest(object sender, EventArgs e)
{
MiniProfiler.Stop(discardResults: !IsAnAdmin());
}
更新更新:您可能还需要在<system.webServer>
,<handlers>
部分中将以下内容添加到web.config中:
<add name="MiniProfiler" path="mini-profiler-resources/*" verb="*"
type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified"
preCondition="integratedMode" />