2011-06-26 27 views
10

Tôi đang cố gắng để có được tôi wildcard http handler to handle *.cshtml pages nhưng yêu cầu không bao giờ đạt xử lý của tôi vì nó có vẻ như nó đang được chặn bởi WebPageHttpModule mà tôi phát hiện tồn tại qua StackTrace này:Làm cách nào để vô hiệu hóa/xóa WebPageHttpModule khỏi các ứng dụng web ASP.NET 4.0?

[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 

Tôi đã cố gắng để vô hiệu hóa tất cả các HttpModules sử dụng Web.Config nhưng điều này không có tác dụng, (nó cũng không xuất hiện trong phần IIS HttpModules):

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

Săn bắn xung quanh với ILSpy cho thấy đoạn mã sau vào System.Web.WebPages.dll là những gì đăng ký 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(); 
     } 
    } 
} 

Nhưng đó là một vani NET 4.0 ứng dụng và tôi không có một tham chiếu đến bất kỳ System.Web.WebPages, MVC hoặc dlls Razor Tôi chỉ tham khảo System.Web.

Vậy các hội đồng này được tải như thế nào, tại sao WebPageHttpModule được đăng ký và làm cách nào tôi có thể xóa/vô hiệu hóa nó?

Trả lời

8

Nếu bạn đang cố gắng để tắt ASP.NET trang web, bạn có thể đặt cờ này trong cài đặt ứng dụng:

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

này không làm việc cho tôi. Tôi vẫn kết thúc với 404 cho tất cả các URL kết thúc bằng '.cshtml' Tôi đang cố gắng viết một trình duyệt mã nguồn, và tôi không thể có nó trên * bất kỳ phần mở rộng * URL nào. Bất kỳ đề xuất? –

+0

Ồ, tôi quên đề cập đến rằng tôi có một câu hỏi riêng cho việc này: http://stackoverflow.com/questions/7210515/routing-requests-that-end-in-cshtml-to-a-controller –

2

Chỉ cần đào một vòng và một số mã trong đó là .. thô, để nói rằng ít nhất.

Dưới đây là một ảnh mã từ 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] 
} 

Nếu bạn sẵn sàng để sử dụng phản xạ và bạn đang chạy trong Full Trust, bạn có thể truy cập vào _supportedExtensions tĩnh lĩnh vực tư nhân của WebPageHttpHandler qua Reflection và loại bỏ các mục cshtml và vbhtml khỏi danh sách trong trình xử lý PreApplicationInit của riêng bạn. Từ những gì tôi có thể thấy trong DynamicModuleUtility, việc loại bỏ đăng ký WebPageHttpHandler sẽ có liên quan nhiều hơn thế.

Các vấn đề liên quan