#http #asp.net-core #controller #asp.net-core-3.1 #catch-all
#http #asp.net-core #контроллер #asp.net-core-3.1 #catch-all
Вопрос:
Я хотел бы уловить путь к моему контроллеру в виде строки для обработки всех запросов:
[ApiController]
[Route("[controller]")]
public class BackendController : ControllerBase
{
[Route("Backend/{url}")]
public Task<HttpResponseMessage> CatchAll(string url)
{
var requestmessage = HttpContext.Request;
//Do stuff
}
}
Я нашел много вещей в asp.net ядро 2.1, но мне не удалось заставить его работать с моим решением..
Заранее спасибо
Комментарии:
1. Я нашел очень хорошую статью, пожалуйста, посмотрите: dev2u.net/2021/06/03 /…
Ответ №1:
[ApiController]
[Route("api/[controller]/[action]/{url}")]
public class BackendController : ControllerBase
{
[HttpGet]
public IActionResult GenericAction(string url)
{
var queryString = HttpContext.Request.QueryString;
return Ok($"url: {url}, queryString: {queryString}");
}
}
Результат из приведенного выше кода:
Url: https://127.0.0.1:5001/api/backend/GenericAction/product?id=100
Ответ: url: product, строка запроса: ?id=100
url: https://127.0.0.1:5001/api/backend/GenericAction/company?name=michael
Ответ: url: company, строка запроса: ?name=michael
# Редактировать
Если вы хотите добавить все http-действия к одному
[HttpGet]
[HttpPost]
[HttpPut]
[HttpDelete]
public IActionResult GenericAction(string url)
{
var queryString = HttpContext.Request.QueryString;
return Ok($"url: {url}, queryString: {queryString}");
}
# Редактировать
Без названия действия
[ApiController]
public class BackendController : ControllerBase
{
[HttpGet]
[HttpPost]
[HttpPut]
[HttpDelete]
[Route("api/backend/{url}")]
public IActionResult Get(string url)
{
var queryString = HttpContext.Request.QueryString;
return Ok($"url: {url}, queryString: {queryString}");
}
}
Комментарии:
1. Спасибо за ваш ответ, но возможно ли перегруппировать все Http-действия в одно? Если я последую этому, я дам создать метод для каждого действия, и они будут делать в основном то же самое (прокси)
2. Спасибо за ваш ответ, последнее, что я хочу сделать, это напрямую получить доступ к маршруту после «серверной части». localhost/Backend/{Url} Без каких-либо конкретных действий
Ответ №2:
Вы можете использовать синтаксис параметра маршрута с циклическим отключением :
Route Sample
/search/{*page} /search/admin/products (the forward slash is encoded)
/search/{**page} /search/admin/products
Я использую CatchAll
шаблон для улавливания всех маршрутов и методов для моего эхо-примера :
[ApiController]
[Route("{**catchAll}")]
public class EchoController : ControllerBase
{
[Route("/{**catchAll}")]
public IActionResult Echo()
{
return Ok();
}
}
Дополнительная информация о документах Microsoft
Комментарии:
1. Это правильный ответ. Спасибо!
Ответ №3:
Если вы хотите получить путь запроса и обрабатывать все запросы, вы можете использовать промежуточное программное обеспечение.
Вот демонстрация:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
//get path
var path = context.Request.Path.ToString();
//when path == what you want,do something
if (path == "xxxx")
{
//do something
}
await next();
});
...................
}