Ich habe ein Legacy-Projekt, das eine einzige IHttpHandler-Implementierungsklasse hat, die alle Anfragen mit einer riesigen switch-Anweisung usw. weiterleitet. Ich versuche Attribute Routing mit ApiControllern einzuführen, aber die erste hat immer die Priorität. Ist es möglich, das System (entweder Code oder IIS) so zu konfigurieren, dass Web ApiControllers Priorität vor meiner einzigen implementierenden Klasse IHHTpHandler haben? In IIS setze ich zuerst mein AttributeRouting ein und dann gibt es alle Aspx-Einsen, aber der Web-API-Controller wird nicht zuerst verarbeitet ... egal, was ich tue (sie unter dem gleichen Projekt zu haben). Ich möchte kein separates Projekt vorstellen.
Edit: Es gibt ein IHttpModule, das basierend darauf entscheidet, was nach api / liegt, um es zu einer bestimmten aschex-Datei zu leiten. Einer von ihnen ist der beschriebene ..
Bearbeiten 2: Genauer gesagt: Wenn die URL keine Liste gefilterter Dinge [Datei, Nachricht, Eigenschaft ...] enthält, wird sie an Resource.aspx weitergeleitet.
Also würde api / file, api / message, api / property von anderen .ashx-Dateien behandelt werden - andernfalls geht der Datenverkehr zu Resource.ashx ...
Als Ergebnis die Anfragen, die api / endpoint1, api / endpoint2, api / endpoint3 haben werden alle zu Resource.aspx gehen. Die Frage ist, wie man api / endpoint3 an den unten beschriebenen API-Controller weiterleitet. Danke
Vereinfachte Code-Architektur:
%Vor% %Vor% %Vor% %Vor% Ich habe zwei Lösungen für dieses Problem gefunden. Die erste besteht darin, das Modul zu modifizieren, das URLs neu schreibt, indem es eincheckt, ob das Web-API-Routing-System eine Anfrage verarbeiten kann. Die zweite besteht darin, der Anwendung ein weiteres Modul hinzuzufügen, das Anfragen an den Web-API-Handler mit HttpContext.RemapHandler()
leitet.
Hier ist Code:
Erste Lösung.
Wenn Ihr Modul wie folgt aussieht:
%Vor%Dann müssen Sie es wie folgt ändern:
%Vor%Zweite Lösung.
Modul für die Neuzuordnung von Handlern:
%Vor% Diese Lösungen funktionieren, wenn die Methode WebApiConfig.Register
leer ist, aber wenn es Routen mit Vorlagen wie "api/{controller}"
gäbe, würde jeder Pfad mit zwei Segmenten, der mit "api" beginnt, die Prüfung bestehen, auch wenn keine Controller mit angegeben sind Name und Modul können für diesen Pfad etwas Nützliches tun. In diesem Fall können Sie zum Beispiel eine Methode aus dieser Antwort verwenden, um zu überprüfen, ob der Controller existiert.
Auch das Web-API-Routing-System akzeptiert die Route, selbst wenn der gefundene Controller keine Anfragen für die aktuelle http-Methode bearbeitet. Sie können den Nachkommen von RouteFactoryAttribute
und HttpMethodConstraint
verwenden, um dies zu vermeiden.
UPD Getestet auf diesen Controllern:
%Vor%Tags und Links asp.net-mvc asp.net-web-api c# asp.net httphandler