2009-12-11 6 views
19

Ho cercato un po 'questo, ma non ho trovato una risposta: esiste un modo per aggiungere un HttpHandler a un sito Web ASP.NET in modo programmatico senza aggiungerlo a web.config?Un modo per aggiungere HttpHandler a livello di programmazione in .NET?

+0

Intresting, id piace vedere se questo è possibile solo. Curioso però, perché non aggiungerlo semplicemente a web.config? in quanto ciò influenza solo l'unico sito/app non tutti IIS – Jammin

risposta

18

Con l'aggiunta di un HttpHandler suppongo che voi dire i file di configurazione

<system.web> 
    <httpHandlers>...</httpHandler> 
</system.web> 

C'è un modo per controllare automaticamente, aggiungendo il IHttpHandler in diretta durante la richiesta. Così il PostMapRequestHandler in the Application Lifecycle, si dovrebbe effettuare le seguenti operazioni, in tue IHttpModule:

private void context_PostMapRequestHandler(object sender, EventArgs e) 
{ 
    HttpContext context = ((HttpApplication)sender).Context; 
    IHttpHandler myHandler = new MyHandler(); 
    context.Handler = myHandler; 
} 

E questo dovrebbe impostare automaticamente il gestore per tale richiesta. Ovviamente probabilmente vorrai concludere questo in qualche logica per verificare cose come verbo, url di richiesta, ecc. Ma questo è come si farebbe. Anche questo è il numero di Rewriters URL popolari funzionano come ad esempio:

http://urlrewriter.codeplex.com

Purtroppo, però, con il pre built configuration handler that the web.confi g fa, è nascosto e non sembra essere accessibile. Si basa su un'interfaccia chiamata IHttpHandlerFactory.

Aggiornamento Il IHttpHandlerFactory può essere usato come qualsiasi altro IHttpHandler, solo che viene utilizzato come punto di partenza, invece di un punto di trasformazione. Vedi questo articolo.

http://www.uberasp.net/getarticle.aspx?id=49

+0

Grazie Nick: questo è esattamente quello che stavo cercando. –

+0

Problemi a ottenere questo approccio al lavoro per la mia situazione. Le richieste che sto tentando di riassegnare a un gestore per non corrispondono a file fisici oa nessuno dei miei percorsi configurati. 'PostMapRequestHandler' non sta sparando nel mio caso in quanto non viene trovato nessun gestore per mappare la richiesta? Sembra che l'ultimo evento che spara per queste richieste sia 'PostResolveRequestCache' e se provo a resettare' context.Handler' in quello o in qualsiasi altro gestore di eventi precedenti, viene semplicemente ignorato. – Lobstrosity

+0

Sono riuscito a farlo funzionare chiamando 'context.RemapHandler()' (invece di impostare 'context.Handler' direttamente) nel gestore di eventi' BeginRequest'. – Lobstrosity

10

È possibile utilizzando una classe IRouteHandler.

  1. Implementare l'interfaccia IRouteHandler di una nuova classe e restituire la curva come il risultato della sua GetHttpHandler metodo
  2. Registra il percorso/

Implementare IRouteHandler

public class myHandler : IHttpHandler, IRouteHandler 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     // your processing here 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return this; 
    } 
} 

Percorso di registrazione:

//from global.asax.cs 
protected void Application_Start(object sender, EventArgs e) 
{ 
    RouteTable.Routes.Add(new Route 
    (
     "myHander.axd", 
     new myHandler() 
    )); 
} 

Nota: se utilizzando ASP.NET Webforms quindi assicurare il vostro webapp ha la configurazione UrlRouting nel web.config come spiegato qui: Use Routing with Web Forms

+0

Grazie! Esattamente quello di cui avevo bisogno ... – rocky

Problemi correlati