Отказ от ответственности : Прежде всего, я хочу отметить, что я искал ответ по всему Интернету, прочитал всю документацию, прочитал все вопросы, которые я мог найти здесь, но пока не повезло.
Итак, вот мой случай.Я создаю API с использованием ASP.NET Core 2.2 и использую HATEOAS (спецификация HAL и библиотека Halcyon ).Я должен предоставить ссылки вместе с самим ресурсом.Это то, что привело меня к HATEOAS.Некоторые из ссылок являются шаблонными, поскольку это может быть метод PUT
, а id
должен быть задан внешним интерфейсом.
Проблема в том, что мои контроллеры могут иметь очень разные маршруты (используя атрибуты на основе атрибутов).маршрутизация) и жесткое кодирование ссылок - это плохо, потому что, если маршрут меняется, мне нужно помнить, чтобы изменить ссылку, где он также используется.По этой причине я решил создать ссылку на основе типа контроллера и имени действия.LinkGenerator - это то, что я нашел, но, похоже, он возвращает ноль, если я не укажу все параметры для маршрута.Вот пример кода:
[Route("api/metadata")]
[ApiController]
public class MetadataController : ControllerBase
{
private readonly IMetadataProvider _metadataProvider;
private readonly LinkGenerator _linkGenerator;
public MetadataController(
IMetadataProvider metadataProvider,
LinkGenerator linkProvider)
{
_metadataProvider = metadataProvider;
_linkGenerator = linkProvider;
}
[HttpGet]
public IActionResult GetMetadata()
{
var metadata = _metadataProvider.GetMetadata();
// here url will be 'null', because last parameter is null
// and route requires parameter 'name' to be specified instead of 'null'
// EXPECTED: "api/metadata/{name}"
// ACTUAL: null
string url = _linkGenerator.GetPathByAction(
nameof(MetadataController.GetByName),
nameof(MetadataController).Replace(nameof(Controller), string.Empty),
null);
var response = new HALResponse(metadata)
.AddSelfLink(HttpContext.Request)
.AddLinks(new Link(name, url));
return Ok(response);
}
[HttpGet("{name}")]
public IActionResult GetByName(string name)
{
var metadata = _metadataProvider.GetMetadataForEntity(name);
return Ok(metadata);
}
}
Как мне сгенерировать ссылку, чтобы она не была жестко запрограммирована и имела шаблон?