Я внедряю веб-API, который возвращает 202 Принятый клиенту, когда ресурс еще не доступен.URL, возвращаемый клиенту, будет выглядеть примерно так:
http://host/api/v2/**thing**reqests/*guid*
Я хочу сделать это в общем, так как у меня много разных типов ресурсов (и, следовательно, контроллеров), и я не хочудублированный код.
Я создал
[AttributeUsage(AttributeTargets.Class)]
public class RelatedControllerAttribute : Attribute
{
public Type RelatedControllerType { get; }
public RelatedControllerAttribute(Type relatedControllerType) => RelatedControllerType = relatedControllerType;
}
и применил его к главному контроллеру примерно так
[RelatedController(typeof(ThingRequestsController))]
public class ThingsController : ApiController<ThingRequest>
Это позволяет мне получить шаблон маршрута, связанный с контроллером запросов.
[Route("api/v{version:apiVersion}/[controller]")]
с этим кодом в базовом классе ThingsController
private string GetRequestsRoute()
{
if (_requestsPath != null)
return _requestsPath;
var a = GetType().GetCustomAttribute<RelatedControllerAttribute>();
if (a == null)
throw new NotSupportedException();
var routeTemplate = a.RelatedControllerType.GetCustomAttribute<RouteAttribute>().RouteTemplate;
return _requestsPath = route.Name;
}
Это дает мне почти весь путь.Как создать экземпляр шаблона маршрута с правильными значащими значениями.Есть ли что-то встроенное в ASP.NET Core?Я легко могу выполнить часть маршрута [controller]
, но как мне выполнить часть {version:ApiVersion}
(полученную из ApiExplorer)?