Route-Handler in ASP.Net WebAPI
Ich bin in der Lage, erfolgreich registrieren Sie einen benutzerdefinierten route-handler (abgeleitet von IRouteHandler) innerhalb von global.asax.cs eine Web-API-route ala:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{client}/api/1.0/{controller}/{action}/{id}",
defaults: new{id = UrlParameter.Optional}
).RouteHandler = new SingleActionAPIRouteHandler();
Aber ich kann nicht scheinen zu finden ein Weg, dies zu tun, wenn Sie versuchen, um das setup einer in-memory-host für die API zur integration testen, wenn ich rufe HttpConfiguration.Routen.MapRoute ich bin nicht in der Lage, einen handler über das zurückgegebene IHttpRoute.
Sollte, mache ich das anders (zum Beispiel durch die Verwendung einer benutzerdefinierten HttpControllerSelector)? Ich würde natürlich gerne tun es die gleiche Weise in beiden Fällen.
Dank,
Matt
EDIT:
So, was ich am Ende tun war im Grunde die folgenden Ratschläge, die von unten, aber einfach überschreiben des HttpControllerDispatcher-Klasse wie folgt:
public class CustomHttpControllerDispatcher : HttpControllerDispatcher
{
public CustomHttpControllerDispatcher(HttpConfiguration configuration) : base(configuration)
{
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//My stuff here
return base.SendAsync(request, cancellationToken);
}
}
InformationsquelleAutor mattcole | 2012-09-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast Recht. Selbst host gibt IHttpRoute und nimmt HttpMessageHandler als parameter. Es scheint keine eingebaute Möglichkeit, um die Spezifität einer route-handler.
Update: ein bisschen klarer
Sollten Sie fast sicher gehen mit einem HttpControllerSelector und Implementierung einer eigenen... Ein Beispiel sein. http://netmvc.blogspot.co.uk/
Was folgt, ist ein wenig Experimentieren wenn die HttpControllerSelector ist nicht ausreichend für Ihre Anforderungen, aus welchem Grund auch immer...
Aber, wie Sie sehen können die
MapHttpRoute
hat eine überlastung fürHttpMessageHandler
so Sie Experimentieren können mit diesem... wenn der handler NULL ist, dann ist die Grundeinstellung IHttpController aber Sie können setzen Sie Ihre eigene und verwenden diese, um direkt an den richtigen controller... Das MVC-framework zu verwenden scheint[HttpControllerDispatcher]
hier, so borgen Sie einige code, können Sie Ihre eigenen controller /Routenwahl-code auch hier haben Sie Zugang zu der route und Wähler und können tauschen Sie es in und aus sich selbst.Diese CustomHttpControllerDispatcher code für die DEMO nur... suchen Sie nach der Zeile
Und vielleicht noch ein Spiel mit...
Beispiel route:
Beispiel CustomHttpControllerDispatcher:
Ich hätte ein bisschen klarer, sorry - ich wollte, zu bestätigen, dass Sie korrekt sind und dass ich vermute (wie du schon getan haben) , sollten Sie einen Blick auf eine benutzerdefinierte HttpControllerSelector netmvc.blogspot.co.uk als Voreinstellung, wenn alle Sie tun, ist die Weiterleitung an eine Steuerung. Ich dachte nur, daß vielleicht Sie Taten mehr als die Kommissionierung Controller und vielleicht wollte andere Handler andere als controller etc... Die CustomHttpControllerDispatcher Idee war ein bisschen eine spielerei und experiment... sorry für die nicht klarer.
Kein problem Mark, am Ende ging ich mit einer version von dem, was Sie vorgeschlagen haben, als ich war im Grunde nur die änderung einiger Werte in der routevalues ich nur überschrieb die SendAsync-Methode, habe meine Arbeit und lassen Sie die pipeline, seinen Weg fortsetzen.
Seien Sie vorsichtig: stackoverflow.com/a/15207334/1325646
wie Sie Prozess beenden, und lassen Sie es fallen in secondaries? auch ich Tue namespace prüfen, ob die 2 passenden controller sind vorhanden, die sind in der gleichen Liste der namespaces, dann den Konflikt, sonst ist es ok, und ich will nur nehmen Sie den controller aus einem bestimmten namespace
InformationsquelleAutor Mark Jones