2011-06-26 51 views
10

我試圖讓我的wildcard http handler to handle *.cshtml pages但因爲它看起來像它的被截獲WebPageHttpModule,我發現通過該堆棧跟蹤存在的要求從來沒有達到我的處理程序:如何禁用/從ASP.NET 4.0 Web應用程序中刪除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 

我試圖使用禁用所有的HttpModules Web.Config中,但沒有任何效果,(它也不會出現在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或剃刀的dll我引用的System.Web

那麼這些程序集是如何加載的,爲什麼WebPageHttpModule被註冊,我該如何刪除/禁用它?

回答

8

如果你想關閉ASP.NET網頁,你可以在應用設置中設置此標誌:

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

這不是爲我工作。我仍然以404結尾爲所有以'.cshtml'結尾的網址我試圖編寫一個源代碼瀏覽器,並且我不能讓它失敗*任何* URL擴展名。有什麼建議麼? –

+0

哦,我忘了提及,我有這個單獨的問題:http://stackoverflow.com/questions/7210515/routing-requests-that-end-in-cshtml-to-a-controller –

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註冊將會涉及更多的內容。

相關問題