2013-05-13 15 views
13

Gibt es eine Möglichkeit statische Routenwerte von einer Servicemethode (außerhalb eines Controllers) zu erhalten, die in einem Web-API-Kontext ausgeführt wird? Zum Beispiel kann ich folgende in ASP.NET MVC tun:Web API Routenwerte abrufen

var mvcHandler = HttpContext.Current.Handler as MvcHandler; 
var routeValues = mvcHandler.RequestContext.RouteData.Values; 

Ich mag würde die entsprechende Version dieses Codes für Web-API zu finden.

Wenn ich versuche, eine Beispiel-Web-API-Anfrage zu debuggen und auf HttpContext.Current.Handler zu schauen, ist es vom Typ HttpControllerHandler, aber dieser Typ hat keine Eigenschaften, um auf Routendaten zuzugreifen.

EDIT

Um zu versuchen, einige weitere Informationen bieten zu können. Der Code, den ich versuche, den Wert zu lesen, befindet sich innerhalb einer Factory-Klasse, die ein benutzerdefiniertes Objekt für meine Anwendung erstellt.

+0

Kyle, würden Sie bitte die Web API-Version des Codes für uns veröffentlichen? –

+0

Das ist, was ich versuche herauszufinden :) – Kyle

+0

Meinst du, du hast mit System.Web.Http; var handler = Http.Current.Handler 'und es als HttpControllerHandler gefunden? –

Antwort

10

konnte ich eine Lösung finden, die die Route Wert für entweder eine MVC-Anforderung oder eine Web-API-Anfrage bekommen würden.

18

Sie können die GetRouteData() - Erweiterung für HttpRequestMessage verwenden. Sie müssten den System.Net.Http-Namespace einschließen, um dies zu erhalten.

System.Web.Http.Routing.IHttpRouteData routeData = Request.GetRouteData(); 
+0

Danke. Es scheint, dass dies innerhalb eines Controllers funktionieren würde, aber außerhalb eines Controllers hat HttpContext.Current.Request nicht den Typ HttpRequestMessage (und kann nicht in ihn umgewandelt werden). Ich hätte das im OP besser klären sollen. – Kyle

+0

Nein, Sie können darauf zugreifen, wo immer Sie auf HttpRequestMessage zugreifen können. Beispiel innerhalb Nachrichtenhandler: ‚public class DelegateHandlerA: DelegatingHandler { protected override async Aufgabe SendAsync (HttpRequestMessage Anfrage, CancellationToken CancellationToken) { System.Web.Http.Routing.IHttpRouteData Routedata = request.GetRouteData(); HttpResponseMessage Antwort = warten base.SendAsync (Anfrage, cancellationToken); Antwort zurücksenden; } } ' –

+0

BTW, GetRouteData() Erweiterung würde eine konsistente Erfahrung über WebHost (IIS) und SelfHost (wo HttpContext nicht verfügbar ist) Szenarien zu geben. –