IRouteHandler in Web Forms: le richieste di routing che richiedono HttpContext.User
-
20-09-2019 - |
Domanda
Sto cercando di aggiungere un percorso piuttosto semplice a un Asp.Net Web Form app (in esecuzione in IIS 7, modalità integrata): per le richieste di venire a http://mydomain.com/foo/ vorrei mostrare i risultati di una pagina dinamica ( http://mydomain.com/foopage.aspx ).
Ho creato un RouteHandler che fa tutto questo e sembra essere di routing in modo corretto.
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;
}
Il problema è che, dentro il mio metodo di GetHttpHandler RouteHandler, tutte le istanze dell'utente corrente (requestContext.HttpContext.User, System.Web.HttpContext.Current.User) sono nulli. Purtroppo, foo.aspx ha bisogno di sapere ciò che l'utente corrente è (per i controlli d'accesso, roba ruolo, ecc), in modo da rendere la pagina è generare eccezioni riferimento null. La mia ipotesi è che questi gestori di percorso stanno sparando fuori prima Asp.Net ottiene la possibilità di cablare il HttpContext con le informazioni dell'utente. Qualsiasi idea di un work-around?
PS - Mi rendo conto che questo può essere realizzato facendo una server.Transfer in una pagina a http: / /mydomain.com/foo/default.aspx . Mi piacerebbe utilizzare il routing per questo genere di cose, piuttosto che avere un gruppo di cartelle inutili ingombrare le cose.
Grazie!
Soluzione 2
Sono riuscito a calcolare questo fuori me stesso.
Un po 'come questa domanda , miei percorsi funzionavano bene quando l'origine del percorso è conclusa in aspx ( http : //mydomain.com/foo-origin.aspx ), ma non è riuscito quando non hanno ( http://mydomain.com/foo-origin/ ).
L'articolo MSDN su come configurare il routing con moduli web racconta di apportare alcune modifiche al web di configurazione, ma lascia che è necessario impostare runAllManagedModulesForAllRequests a true nel nodo moduli:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</system.webServer>
</configuration>
Ora funziona a meraviglia.
Altri suggerimenti
Si veda la risposta al questa domanda , molto simile.