【问题标题】:How can I disable/remove the WebPageHttpModule from ASP.NET 4.0 web applications?如何从 ASP.NET 4.0 Web 应用程序中禁用/删除 WebPageHttpModule?
【发布时间】:2023-03-14 19:04:01
【问题描述】:

我正在尝试获取我的wildcard http handler to handle *.cshtml pages,但该请求从未到达我的处理程序,因为它看起来被我通过此 StackTrace 发现存在的 WebPageHttpModule 拦截:

[HttpException (0x80004005): Exception of type 'System.Web.HttpException' was thrown.]
   System.Web.WebPages.ApplicationStartPage.ExecuteStartPage(HttpApplication application, Action`1 monitorFile, Func`2 fileExists, Func`2 createInstance, IEnumerable`1 supportedExtensions) +88
   System.Web.WebPages.ApplicationStartPage.ExecuteStartPage(HttpApplication application) +287
   System.Web.WebPages.WebPageHttpModule.StartApplication(HttpApplication application, Action`1 executeStartPage, EventHandler applicationStart) +113
   System.Web.WebPages.WebPageHttpModule.StartApplication(HttpApplication application) +71
   System.Web.WebPages.WebPageHttpModule.Init(HttpApplication application) +156
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +431
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +194
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +339
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253

[HttpException (0x80004005): Exception of type 'System.Web.HttpException' was thrown.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +8972180
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +256

我尝试使用 Web.Config 禁用所有 HttpModules,但这没有效果,(它也没有出现在 IIS HttpModules 部分中):

<system.web>
    <httpModules>
        <clear/>
    </httpModules>
</system.web>
    ....
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <clear/>
    </modules>
</system.webServer>

用 ILSpy 搜索发现 System.Web.WebPages.dll 中的以下代码是注册 WebPageHttpModule 的代码:

namespace System.Web.WebPages
{
    [EditorBrowsable(EditorBrowsableState.Never)]
    public static class PreApplicationStartCode
    {
        private static bool _startWasCalled;
        public static void Start()
        {
            if (PreApplicationStartCode._startWasCalled)
            {
                return;
            }
            PreApplicationStartCode._startWasCalled = true;
            WebPageHttpHandler.RegisterExtension("cshtml");
            WebPageHttpHandler.RegisterExtension("vbhtml");
            PageParser.EnableLongStringsAsResources = false;
            DynamicModuleUtility.RegisterModule(typeof(WebPageHttpModule));
            ScopeStorage.CurrentProvider = new AspNetRequestScopeStorageProvider();
        }
    }
}

但它是一个普通的 .NET 4.0 应用程序,我没有引用任何 System.Web.WebPages、MVC 或 Razor dll 我引用 System.Web。

那么这些程序集是如何加载的,为什么要注册 WebPageHttpModule 以及如何删除/禁用它?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 razor asp.net-webpages


    【解决方案1】:

    如果您尝试关闭 ASP.NET 网页,可以在应用设置中设置此标志:

    <add key="webpages:Enabled" value="false" />
    

    【讨论】:

    • 这对我不起作用。对于所有以.cshtml 结尾的 URL,我仍然会得到 404。有什么建议吗?
    • 哦,我忘了说我有一个单独的问题:stackoverflow.com/questions/7210515/…
    【解决方案2】:

    刚刚挖掘了一下,其中的一些代码……至少可以说是粗糙的。

    这是来自 WebPageHttpHandler 的代码片段:

    namespace System.Web.WebPages
    {
      public class WebPageHttpHandler : IHttpHandler, IRequiresSessionState
      {
        private static List<string> _supportedExtensions = new List<string>();
    
        public static void RegisterExtension(string extension)
        {
          WebPageHttpHandler._supportedExtensions.Add(extension);
        }
    
      // [snip]
    }
    

    如果您愿意使用反射并且在完全信任下运行,则可以通过反射访问 WebPageHttpHandler 的 _supportedExtensions 静态私有字段,并从您自己的 PreApplicationInit 处理程序的列表中删除 cshtml 和 vbhtml 项。从我在 DynamicModuleUtility 中看到的情况来看,删除 WebPageHttpHandler 注册会比这更复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多