Генерация URL-адреса ресурса в веб-API asp.net вне ApiController
Автор вопроса: EatdokuОтветов: 3
Ищете способ создать или сгенерировать URL-адрес для определенного ресурса в веб-API asp.net. Это можно сделать в контроллере, поскольку он наследуется от ApiController, поэтому вы получаете UrlHelper.
Я хочу создать URL-адрес ресурса вне контекста ApiController.
Ответы
Ответ 1 · рейтинг 2 · Andrey Shchekin
Вот что я сделал:
Требуется HttpContext/Request, поэтому может не работать в Application_Start.
Проверено только в WebApi 1
Работает только для маршрутов, зарегистрированных в GlobalConfiguration (но если у вас есть какой-то другой, просто передайте его)
// given HttpContext context, e.g. HttpContext.Current
var request = new HttpRequestMessage(HttpMethod.Get, context.Request.Url) {
Properties = {
{ HttpPropertyKeys.HttpConfigurationKey, GlobalConfiguration.Configuration },
{ HttpPropertyKeys.HttpRouteDataKey, new HttpRouteData(new HttpRoute()) },
{ "MS_HttpContext", new HttpContextWrapper(context) }
}
};
var urlHelper = new UrlHelper(request);
У MVC есть несколько полезных статических методов, принимающих информацию о маршрутизации, или его можно использовать как экземпляр, созданный путем передачи RequestContext (который доступен в большинстве фильтров MVC и в других местах). Методы экземпляра должны быть именно тем, что вам нужно для создания URL-адресов.
HTTP принимает ControllerContext (который также доступен в большинстве фильтров HTTP и в других местах).
Ответ 3 · рейтинг -1 · rposky
Я не уверен насчет ApiController, так как раньше им не пользовался. Тогда это может быть для вас излишним, но опять же, может и не быть. Проверьте свой файл Global.asax.cs, особенно функцию RegisterRoutes. Первоначально вы должны увидеть следующее сопоставление:
routes.MapRoute ("Default", "{controller}/{action}/{id}", new { controller = "MyController", action = "Index", id = "" });
Итак, по умолчанию ваше приложение настроено на обработку маршрутов в следующем формате:
{ControllerName}/{ActionName}/{ResourceId}
Класс контроллера, настроенный следующим образом, должен позволить вам получать запросы в этом формате.
class {ControllerName}Controller : ApiController
{
public ActionResult {ActionName} (string id)
{
// fetch your resource by its unique identifier
}
}