Как я могу отключить / удалить модуль WebPageHttpModule из веб-приложений ASP.NET 4.0? - PullRequest
10 голосов
/ 26 июня 2011

Я пытаюсь заставить мой подстановочный http-обработчик обрабатывать * .cshtml страниц , но запрос никогда не достигает моего обработчика, так как похоже, что он перехватывается WebPageHttpModule, который, как я обнаружил, существует через эту StackTrace:

[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, но это не имеет никакого эффекта (это также не отображается в разделе Itt ​​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, и у меня нет ссылок ни на какие dll System.Web.WebPages, MVC или Razor. Я только ссылаюсь System.Web .

Итак, как загружаются эти сборки, почему регистрируется WebPageHttpModule и как его удалить / отключить?

Ответы [ 2 ]

8 голосов
/ 27 июня 2011

Если вы пытаетесь отключить веб-страницы ASP.NET, вы можете установить этот флаг в настройках приложения:

<add key="webpages:Enabled" value="false" />
2 голосов
/ 26 июня 2011

Просто покопался и немного кода там .. грубо, если не сказать больше.

Вот фрагмент кода из 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]
}

Если вы хотите использовать отражение и работаете в режиме полного доверия, вы можете получить доступ к статическому приватному полю _supportedExtensions:WebPageHttpHandler через Reflection и удалите элементы cshtml и vbhtml из списка в своем собственном обработчике PreApplicationInit.Из того, что я видел в DynamicModuleUtility, удаление регистрации WebPageHttpHandler было бы более сложным, чем это.

...