J'ai fait des recherches un peu mais je n'ai pas trouvé de réponse - est-il possible d'ajouter par programme un HttpHandler à un site Web ASP.NET sans l'ajouter au web.config?Une façon d'ajouter HttpHandler par programme dans .NET?
Répondre
En ajoutant un HttpHandler Je suppose que vous voulez dire les fichiers de configuration
<system.web>
<httpHandlers>...</httpHandler>
</system.web>
Il est un moyen de contrôler automatiquement, en ajoutant le IHttpHandler
directement lors de la demande. Donc, sur le PostMapRequestHandler in the Application Lifecycle, vous procédez comme suit, dans votre propre coutume IHttpModule
:
private void context_PostMapRequestHandler(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
IHttpHandler myHandler = new MyHandler();
context.Handler = myHandler;
}
Et qui fixerait automatiquement le gestionnaire pour cette demande. Évidemment, vous voudrez probablement envelopper ceci dans une certaine logique pour vérifier des choses telles que le verbe, demandant l'URL, etc. Mais c'est ainsi que cela serait fait. Aussi c'est combien de Rewriters URL populaires fonctionnent comme:
http://urlrewriter.codeplex.com
Malheureusement, en utilisant la pre built configuration handler that the web.confi g ne, se cache et ne semble pas être accessible. Il est basé sur une interface appelée IHttpHandlerFactory
.
Mise à jour Le IHttpHandlerFactory
peut être utilisé comme n'importe quel autre IHttpHandler, mais il est utilisé comme point de lancement au lieu d'un point de traitement. Voir cet article.
Merci Nick - c'est exactement ce que je cherchais. –
J'ai du mal à faire fonctionner cette approche pour ma situation. Les demandes que j'essaie de réaffecter à un gestionnaire ne correspondent pas à des fichiers physiques ou à l'un de mes itinéraires configurés. Est-ce que 'PostMapRequestHandler' ne déclencherait pas dans mon cas, car aucun gestionnaire n'est trouvé pour mapper la requête? Il semble que le dernier événement qui déclenche ces requêtes soit 'PostResolveRequestCache' et si j'essaie de réinitialiser' context.Handler' dans ce gestionnaire d'événement ou dans un autre, il sera simplement ignoré. – Lobstrosity
J'ai pu le faire fonctionner en appelant 'context.RemapHandler()' (au lieu de définir 'context.Handler' directement) dans le gestionnaire d'événements' BeginRequest'. – Lobstrosity
Vous pouvez en utilisant une classe IRouteHandler.
- Mettre en oeuvre l'interface IRouteHandler dans une nouvelle classe et retourner le virage à la suite de sa méthode
GetHttpHandler
- Inscrivez votre itinéraire/
Mettre en œuvre 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;
}
}
Inscription Itinéraire:
//from global.asax.cs
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new Route
(
"myHander.axd",
new myHandler()
));
}
Note: si vous utilisez Asp.Net Webforms puis vous assurer que votre webapp a la configuration UrlRouting dans le web.config comme expliqué ici: Use Routing with Web Forms
Merci! Exactement ce dont j'avais besoin ... – rocky
Intresting, id aiment voir si cela est possible moi-même. Curieux cependant, pourquoi ne pas simplement ajouter le web.config? car cela n'affecte que le seul site/application de IIS – Jammin