Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Генерация 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);

Ответ 2 · Andrew

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

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

У 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
      }
 }

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы