【问题标题】:How to make glimpse work with hot-towel mvc4?如何使用热毛巾 mvc4 使一瞥工作?
【发布时间】:2013-09-27 23:30:06
【问题描述】:

我想在我的 mvc4 hot-towel 项目中添加 glimpse 诊断工具。

我正在按照指令http://nuget.org/packages/Glimpse.Mvc4/ 并在我的项目中安装glimpse 的mvc4 nuget 包。

如下所示,它正在正确安装并获得依赖和更新 web.config。

<httpModules>
  <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" />
</httpModules>
<httpHandlers>
  <add path="glimpse.axd" verb="GET" type="Glimpse.AspNet.HttpHandler, Glimpse.AspNet" />
</httpHandlers>

<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="Glimpse" path="glimpse.axd" verb="GET" type="Glimpse.AspNet.HttpHandler, Glimpse.AspNet" preCondition="integratedMode" />
</handlers>
<validation validateIntegratedModeConfiguration="false" />
<modules>
  <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" preCondition="integratedMode" />
</modules>

<glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd">
<!-- If you are having issues with Glimpse, please include this. It will help us figure out whats going on. 
  <logging level="Trace" />-->
<!-- Want to use Glimpse on a remote server? Ignore the LocalPolicy by removing this comment.
  <runtimePolicies>
    <ignoredTypes>
      <add type="Glimpse.AspNet.Policy.LocalPolicy, Glimpse.AspNet"/>
    </ignoredTypes>
  </runtimePolicies>-->

但是,当我运行项目并输入诸如 http://mylocalurl.com/glimpse.axd 之类的 URL 时。它没有找到 axd 文件,所以我无法启用 glimpse。

附:我已经为热毛巾模板定义了加载索引页面的自定义路由。

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Load", action = "Index", id = UrlParameter.Optional }
        );
    }

【问题讨论】:

    标签: asp.net-mvc-4 hottowel glimpse


    【解决方案1】:

    找不到 Glimpse.axd 的原因是配置路由的顺序。

    如果您安装RouteDebugger NuGet package,您会看到还有另一个路由处理 Glimpse.axd 请求,即由 Hot Towel 模板安装的路由,可以在 @ 类的 App_Start 文件夹中找到987654323@

    using System.Web.Mvc;
    
    [assembly: WebActivator.PreApplicationStartMethod(
        typeof(throwaway.App_Start.HotTowelRouteConfig), "RegisterHotTowelPreStart", Order = 2)]
    
    namespace throwaway.App_Start {
      ///<summary>
      /// Inserts the HotTowel SPA sample view controller to the front of all MVC routes
      /// so that the HotTowel SPA sample becomes the default page.
      ///</summary>
      ///<remarks>
      /// This class is discovered and run during startup
      /// http://blogs.msdn.com/b/davidebb/archive/2010/10/11/light-up-your-nupacks-with-startup-code-and-webactivator.aspx
      ///</remarks>
      public static class HotTowelRouteConfig {
    
        public static void RegisterHotTowelPreStart() {
    
          // Preempt standard default MVC page routing to go to HotTowel Sample
          System.Web.Routing.RouteTable.Routes.MapRoute(
              name: "HotTowelMvc",
              url: "{controller}/{action}/{id}",
              defaults: new
              {
                  controller = "HotTowel",
                  action = "Index",
                  id = UrlParameter.Optional
              }
          );
        }
      }
    }
    

    并且由于这条路由将被添加之前执行RouteConfig.RegisterRoutes(由于使用WebActivator),它将处理Glimpse.axd的请求,因为该路由有每个路由参数的默认值,因此将匹配 Glimpse.axd 请求。

    您可以通过删除HotTowelRouteConfig 来解决此问题,但是您必须明确地转到示例网址http://mylocalurl.com/HotTowel/Index,或者您从HotTowelRouteConfig 中删除WebActivator 部分

    [assembly: WebActivator.PreApplicationStartMethod(
        typeof(throwaway.App_Start.HotTowelRouteConfig), "RegisterHotTowelPreStart", Order = 2)]
    

    并通过在调用routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 之后调用HotTowelRouteConfig.RegisterHotTowelPreStart()RouteConfig.RegisterRoutes 中显式注册路由,这样默认情况下您仍将拥有示例,并且 Glimpse.axd 将按预期处理。

    无论哪种方式,这两个选项都涉及删除或更改由 HotTowel NuGet 包管理的文件,因此也许应该将示例放入其自己的 NuGet 包中(例如,您不想将示例投入生产)

    【讨论】:

      【解决方案2】:

      签入Hot Towel GitHub repository 的最新源代码处理这个略有不同。

      HotTowelRouteConfig 中,RegisterHotTowlPreStart 函数更改为:

      public static void RegisterHotTowelPreStart() {
      
        // Ignore requests to .axd HttpHandlers
        System.Web.Routing.RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
      
        // Preempt standard default MVC page routing to go to HotTowel Sample
        System.Web.Routing.RouteTable.Routes.MapRoute(
            name: "HotTowelMvc",
            url: "{controller}/{action}/{id}",
            defaults: new
            {
                controller = "HotTowel",
                action = "Index",
                id = UrlParameter.Optional
            }
        );
      

      这允许包括Glimpse.axd 在内的axd 工作,方法是将它们排除在样本处理之外。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多