Ich arbeite derzeit an einer Enterprise-Webanwendung, die WCF zum Implementieren einer REST-API verwendet. Es verwendet einen VirtualPathProvider, um Anfragen an * .svc-Dateien (die eigentlich nicht existieren) abzufangen und baut sie dann dynamisch auf, um die zugehörigen WCF-Dienste dynamisch zu laden. Dies ermöglicht dem System, "Module" zu haben, die zur Laufzeit zur Anwendung hinzugefügt werden können, ohne den Webserver oder irgendjemanden, der es benutzt, zu beeinflussen.
Was ich gerne wissen würde, ist, wenn das Gleiche mit Web API 2 möglich ist. Ich habe ein paar Nachforschungen angestellt, aber es sieht so aus, als ob die Routen nur beim Start konfiguriert werden können ... Was ich mir erhofft hatte ist ein Mittel, das für nicht existierende Routen verwendet werden kann und grundsätzlich den Controller-Namen aus der Anfrage verwendet, um die assoziierte Assembly (falls vorhanden) zu suchen und zu laden, während programmatisch eine neue Route hinzugefügt wird.
Ich habe gerade mit Web API 2 begonnen, also hoffte ich auf einige erfahrene Benutzer, die mitspielen. Grundsätzlich ist mein Team daran interessiert, zu Web API 2 zu wechseln, um den Overhead und die Komplexität von WCF zu reduzieren Diese besondere Anforderung könnte ein Deal Breaker sein.
Okay, also nach vielen Nachforschungen ... Ich habe die richtige Klasse zum Überschreiben aufgespürt und kann jetzt per Anfrage überprüfen, ob der Controller aufgelöst werden konnte oder nicht, und wenn nicht, versuchen Sie, die richtige Assembly zu laden in den Speicher (basierend auf dem Namen des Controllers im Moment) und den zugehörigen Controller zurückgeben.
Hier ist der Code:
%Vor%und natürlich müssten Sie den Service in der Registrierungsmethode der WebApiConfig als solche ersetzen:
%Vor%Hier gibt es definitiv mehr zu tun, aber das ist ein guter Anfang. Es erlaubt mir, dynamisch Controller zu der Hosting-Website hinzuzufügen, während es läuft und läuft, ohne einen Ausfall zu erfordern.
Das Hauptproblem bei diesem Code ist offensichtlich, dass der neu geladene Controller nicht zur Liste der registrierten Controller hinzugefügt wird. Daher wird die Ausnahme bei jeder Anfrage (für diese Controller) immer ausgelöst und behandelt. Ich prüfe, ob ich es auf irgendeine Weise zur Liste hinzufügen kann, also werden wir sehen, wohin das führt.
Tags und Links asp.net-web-api asp.net-web-api-routing programmatically-created