Генерация URL-адреса ресурса в веб-API asp.net вне ApiController

Ищете способ создать или сгенерировать URL-адрес для определенного ресурса в веб-API asp.net. Это можно сделать в контроллере, поскольку он наследуется от ApiController, поэтому вы получаете UrlHelper.

Я хочу создать URL-адрес ресурса вне контекста ApiController.


person Eatdoku    schedule 07.05.2012    source источник


Ответы (3)


Вот что я сделал:

  • Требуется 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);
person Andrey Shchekin    schedule 23.10.2014
comment
Спасибо, Андрей, чуть не сдался. Оказывается, HttpPropertyKeys.HttpRouteDataKey является обязательным для Mvc.UrlHelper. Отлично Спасибо )! - person Kirill; 20.01.2016
comment
Когда я следую этому, создается мой UrlHelper, но он генерирует URL с 127.0.0.1 в качестве имени хоста. Какой тип конфигурации вы сделали, чтобы заставить это генерировать правильное имя хоста? И есть ли способ заставить его генерировать https, а не http? - person Greg Veres; 12.12.2016
comment
@GregVeres Что в вашем контексте.Request.Url? - person Andrey Shchekin; 12.12.2016

Как насчет классов UrlHelper:

System.Web.Http.Routing.UrlHelper;
System.Web.Mvc.UrlHelper

У MVC есть несколько полезных статических методов, принимающих информацию о маршрутизации, или его можно использовать как экземпляр, созданный путем передачи RequestContext (который доступен в большинстве фильтров MVC и в других местах). Методы экземпляра должны быть именно тем, что вам нужно для создания URL-адресов.

HTTP принимает ControllerContext (который также доступен в большинстве фильтров HTTP и в других местах).

person Andrew    schedule 10.07.2012
comment
System.Web.Http.Routing.UrlHelper теперь принимает только один HttpRequestMessage, который он использует при вызовах Link, чтобы найти имя сервера/домен для использования в начале сгенерированного URL-адреса. HttpRequestMessage также передается в метод GetVirtualPath HttpRouteCollection. Так что похоже, что System.Web.Http.Routing.UrlHelper нам здесь не поможет. - person Iain; 02.05.2013
comment
Для противников альтернатива была бы неплохой, учитывая, что в то время это было абсолютно справедливо. Я оставлю этот ответ просто потому, что комментарии, которые он теперь имеет, имеют ценность. - person Andrew; 23.10.2014

Я не уверен насчет 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
      }
 }
person rposky    schedule 08.05.2012
comment
то, что я пытаюсь найти, - это способ получить URL-адрес с учетом ресурса вне ApiController. В основном на основе ресурса, его идентификатора и некоторого HttpContext программно разрешается абсолютный URL-адрес для этого ресурса. Это для создания службы REST с использованием веб-API asp.net. - person Eatdoku; 08.05.2012