IROUTEHANDLER em formulários da Web: Solicitações de roteamento que exigem httpcontext.user

StackOverflow https://stackoverflow.com/questions/1534162

Pergunta

Estou tentando adicionar uma rota bastante básica a um aplicativo ASP.NET Web Forms (em execução no IIS 7, modo integrado): para solicitações que vêm para http://mydomain.com/foo/ Eu gostaria de mostrar os resultados de uma página dinâmica (http://mydomain.com/fooPage.aspx).

Eu criei um RouteHandler que faz tudo isso e parece estar roteando corretamente.

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
     var page = System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath("~/foo.aspx", typeof(MyApp.Web.Foo)) as MyApp.Web.Foo;
     return page as IHttpHandler;
    }

O problema é que, dentro do método Gethtpphandler do meu RouteHandler, todas as instâncias do usuário atual (requestcontext.httpcontext.user, system.web.httpcontext.current.user) são nulos. Infelizmente, Foo.aspx precisa saber qual é o usuário atual (para controles de login, material de função etc.), portanto, renderizar a página está lançando exceções de referência nula. Meu palpite é que esses manipuladores de rota estão disparando antes do ASP.NET ter a chance de conectar o HTTPContext com as informações do usuário. Alguma idéia de uma subida?

PS - percebo que isso pode ser realizado fazendo um servidor.Transfer em uma página em http://mydomain.com/foo/default.aspx. Eu gostaria de usar o roteamento para esse tipo de coisa, em vez de ter um monte de pastas inúteis atrapalhando as coisas.

Obrigado!

Foi útil?

Solução 2

Consegui descobrir isso sozinho.

Muito parecido essa questão, minhas rotas estavam funcionando muito bem quando a origem da rota terminou em .aspx (http://mydomain.com/foo-origin.aspx), mas falhou quando eles não o fizeram (http://mydomain.com/foo-origin/).

O artigo do MSDN sobre a criação de roteamento com formulários da Web diz para você fazer algumas alterações na configuração da web, mas deixa de fora que você precisa definir RunallManagedModulesForAllRequests para verdadeiro no nó dos módulos:

<configuration>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
  </system.webServer>
</configuration>

Agora funciona muito bem.

Outras dicas

Veja a resposta para isto Pergunta, muito semelhante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top