У меня есть клиент, которому нужно будет использовать один и тот же URL-адрес базовой конечной точки для нескольких запросов с использованием остальных вызовов HttpGet, каждый из которых имеет уникальные параметры и значения запроса. Функция, которую мне нужно отобразить для каждого запроса, будет определяться значением, предоставленным параметром запроса "request". Возможно ли это сделать внутри app.UseEndpoints (), атрибутов функций конечной точки или аналогичного простого решения?
Я немного новичок в этой части, и в документации нет примера для этого. Что у меня пока (не работает):
Startup.cs
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "test1",
pattern: "serviceapi",
constraints: new { request = "test1" }, //map action if param "request" value is "test1"?
defaults: new { controller = "ServiceApi", action = "TestRequest1" }
);
endpoints.MapControllerRoute(
name: "test2",
pattern: "serviceapi",
constraints: new { request = "test2" }, //map action if param "request" value is "test2"?
defaults: new { controller = "ServiceApi", action = "TestRequest2" }
);
});
что я хочу, это когда я использую почтальон для отправки запроса на получение в "{{url}} / api / serviceapi /? request = test1 & uniqueparam1 = foo", он запускается код в моем ServiceApi.TestRequest1 ()
[Route("api/[controller]")]
ServiceApiController.cs
[HttpGet]
public async Task<IActionResult> TestRequest1([FromQuery]string request, [FromQuery]string uniqueparam1)
{
return Ok($"TestRequest1: {request} - {uniqueparam1}");
}
[HttpGet]
public async Task<IActionResult> TestRequest2([FromQuery]string request, [FromQuery]string uniqueparam2, [FromQuery]string uniqueparam3)
{
return Ok($"TestRequest2: {request} - {uniqueparam2}, {uniqueparam3}");
}
Ошибка, которую я получаю сейчас с этим кодом, заключается в том, что обе функции были кандидатами: «Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: запрос соответствует нескольким конечным точкам».
Спасибо!
------ ОБНОВЛЕНИЕ ------
Благодаря ответу Рены мне удалось заставить это работать:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class RequestValueConstraintAttribute : ActionMethodSelectorAttribute
{
public string RequestValue { get; private set; }
private readonly string _requestParam = "request";
public RequestValueConstraintAttribute(string requestValue)
{
RequestValue = requestValue;
}
public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
{
return (string)routeContext.HttpContext.Request.Query[_requestParam] == RequestValue;
}
}
ServiceApiController.cs
[Route("api/[controller]")]
[ApiController]
public class ServiceApiController : ControllerBase
{
[RequestValueConstraint("test1")] //uses this endpoint function if param "request" value is "test1"
[HttpGet]
public async Task<IActionResult> TestRequest1([FromQuery]string request, [FromQuery]string uniqueparam1)
{
return Ok($"TestRequest1: {request} - {uniqueparam1}");
}
[RequestValueConstraint("test2")] //uses this endpoint function if param "request" value is "test2"
[HttpGet]
public async Task<IActionResult> TestRequest2([FromQuery]string request, [FromQuery]string uniqueparam2, [FromQuery]string uniqueparam3)
{
return Ok($"TestRequest2: {request} - {uniqueparam2}, {uniqueparam3}");
}
}