如何从ASP.NET 4.0 Web应用程序中禁用/删除WebPageHttpModule?

我正在尝试使用我的通配符http处理程序来处理* .cshtml页面,但请求永远不会到达我的处理程序,因为它看起来像是被我发现通过此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禁用所有HttpModule但这没有效果,(它也没有出现在IIS HttpModules部分):

      ....      

使用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(); } } } 

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

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

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

  

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

这是WebPageHttpHandler的一段代码:

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

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