2013-05-13 4 views
13

Есть ли способ статически получать значения маршрута из метода службы (за пределами контроллера), который работает в контексте Web API? Например, я могу сделать следующее в ASP.NET MVC:Web API получает значения маршрута

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

Я хотел бы найти эквивалентную версию этого кода для Web API.

Когда я пытаюсь отлаживать образец запроса веб-API и смотрю HttpContext.Current.Handler, он имеет тип HttpControllerHandler, но этот тип не имеет свойств для доступа к данным маршрута.

EDIT

Чтобы попытаться помочь обеспечить больше информации. Код, который я пытаюсь прочитать значение, находится внутри класса фабрики, который у меня есть, который создает пользовательский объект для моего приложения.

+0

Кайл, не могли бы вы разместить версию API для веб-интерфейса для нас? –

+0

Вот что я пытаюсь выяснить :) – Kyle

+0

Вы имеете в виду, что вы использовали «System.Web.Http; var handler = Http.Current.Handler 'и нашел, что это HttpControllerHandler? –

ответ

10

Я смог найти решение, которое получит значения маршрута для запроса MVC или запроса веб-API.

HttpContext.Current.Request.RequestContext.RouteData 
18

Вы можете использовать расширение GetRouteData() для HttpRequestMessage. Для этого вам нужно будет включить пространство имен System.Net.Http.

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

Спасибо. Похоже, что это будет работать в контроллере, но вне контроллера HttpContext.Current.Request не относится к типу HttpRequestMessage (и не может быть передан ему). Я должен был уточнить это лучше в ОП. – Kyle

+0

Нет, вы сможете получить к нему доступ в любом месте, где у вас есть доступ к HttpRequestMessage. Пример внутри обработчика сообщений: «класс DelegateHandlerA общественности: DelegatingHandler { защищен переопределение асинхронной Task SendAsync (HttpRequestMessage запрос, CancellationToken CancellationToken) { System.Web.Http.Routing.IHttpRouteData routeData = request.GetRouteData(); HttpResponseMessage response = ждать base.SendAsync (request, cancelationToken); ответный ответ; } } ' –

+0

Расширение BTW, GetRouteData() даст последовательный опыт в сценариях WebHost (IIS) и SelfHost (где также недоступны сценарии HttpContext). –

Смежные вопросы