Migrando ASP.NET legado para MVC 2 (RC): eventos HttpApplication não disparando, o usuário principal é nulo

Problema

Eu estou tentando tomar um aplicativo da web do asp.net existente e migrá-lo manualmente para usar o MVC 2 (atualmente estou executando o RC). Eu segui várias etapas (eu vou listar em um momento) e parecia ter funcionando, mas depois percebi que não posso definir oAuthorizeAttribute porque o usuário é nulo no controlador. Então notei que quando navego para uma ação, nenhum dos eventos habituais do ciclo de vida do HttpApplication está sendo gerado (como BeginRequest, etc.). Eu acho que isso provavelmente está relacionado ao motivo pelo qual o usuário principal é nulo. O host da web é uma instância local do IIS7 (na minha estação de trabalho do Vista).

Eu criei uma nova aplicação web MVC 2 para usar como referência durante a migração. Ele funciona muito bem, aumentando os eventos do aplicativo e preenchendo o usuário principal como seria de se esperar.

Se você estiver com vontade de se punir, leia os detalhes completos (com o melhor de minha capacidade) abaixo.

Etapas de Migração

Assegure-se de que o App Pool para o diretório de aplicativos seja .NET 2.0 e IntegratedReferenciado System.Web.Abstractions (v.3.5.0.0), System.Web.routing (v3.5.0.0) e System.Web.Mvc (v2.0.0.0) no meu projeto da web. Agora, adicionei System.Web.Mvc como uma referência local para facilitar a integração e a implantação.Modificado o csproj para ativar o bem do MVC VS add-inEste artigo)Adicionado os diretórios Controllers e Views no projeto, adicionados no /Views/web.config do meu aplicativo MVC de exemplo.Modificado meu web.config (NOTA: Eu tenho outra porcaria em módulos e manipuladores, mas eu escondi isso por simplicidade e segurança ... mas esses podem muito bem ser parte do problema):

ocompilation seção:

<compilation defaultLanguage="c#" debug="true">
      <assemblies>
        <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>

opages seção:

<pages enableEventValidation="false"
       pageBaseType="MyAssembly.ThemedBasePage">
  <controls>
    <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </controls>

  <namespaces>
    <add namespace="System.Web.Mvc"/>
    <add namespace="System.Web.Mvc.Ajax"/>
    <add namespace="System.Web.Mvc.Html"/>
    <add namespace="System.Web.Routing"/>
    <add namespace="System.Linq"/>
    <add namespace="System.Collections.Generic"/>
  </namespaces>
</pages>

osystem.webServer/modules seção (lembre-se, o IIS7 integrado):

<modules>
  <remove name="ScriptModule" />
  <remove name="UrlRoutingModule" />
  <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

</modules>

osystem.webServer/handlers seção:

<handlers>
      <remove name="WebServiceHandlerFactory-Integrated"/>
      <remove name="ScriptHandlerFactory"/>
      <remove name="ScriptHandlerFactoryAppServices"/>
      <remove name="ScriptResource"/>
      <remove name="MvcHttpHandler"/>
      <remove name="UrlRoutingHandler"/>
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>

Atualizei meu global.asax para registrar rotas e ignorar coisas que poderiam interferir em meu material legado:

private static void RegisterRoutes(RouteCollection routes)
{
  // place any routes here you need to ignore, whether they
  // be legacy or legitimate resources.
  routes.IgnoreRoute(""); // i currently have functionality at "/", and this route frees up the root to be used by my Default.aspx
  routes.IgnoreRoute("{webForms}.aspx/{*pathInfo}");
  routes.IgnoreRoute("{webServices}.asmx/{*pathInfo}");
  routes.IgnoreRoute("ajaxpro/{*pathInfo}");
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new {controller = "Home", action = "Index", id = ""} // Parameter defaults
  );
}   



protected void Application_Start()
{
   // legacy crap here

   AreaRegistration.RegisterAllAreas();    
   RegisterRoutes(RouteTable.Routes);
}

Informação adicional

Eu também uso a versão mais recente do Autofac (v1.4.5.676) e utilizo seus manipuladores de integração da Web. Eu verifiquei nos dois sentidos, com todo o material de autofact completamente removido / desativado e com tudo configurado da maneira que eu quero; nenhum efeito sobre o assunto de qualquer maneira.

Eu também tentei isso com e sem as minhas configurações IgnoreRoute superdoce. Sem efeito.

Além disso, gostaria de deixar claro que as rotas parecem funcionar, eu sou enviado para os meus controladores e ações corretamente, eu só tenho um principal Null em HttpContext.Current.User e parece não totalmente levantar qualquer ciclo de vida do aplicativo eventos. Se eu não precisasse, você sabe, pegar o diretor atual ou fazer qualquer autorização irritante, eu nunca saberia que algo estava errado;)

E sim, as páginas ASPX regulares funcionam corretamente e os eventos de ciclo de vida do aplicativo são gerados normalmente.

Aqui está um exemplo de um controlador de teste simples que fiz que falha:

    [Authorize]
    public class FartsController : Controller
    {
        //
        // GET: /Farts/
        public ActionResult Index()
        {
            return View();
        }

    }

produzindo a seguinte exceção:

[NullReferenceException: Object reference not set to an instance of an object.]
   System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +48
   System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) +35
   System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +103
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +316
   System.Web.Mvc.Controller.ExecuteCore() +104
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +36
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +34
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +53
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +43
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8678910
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Isso é uma merda :(. Obrigado por ler meu conto.

questionAnswers(2)

yourAnswerToTheQuestion