Веб-api Asp .Net Core 3.1 улавливает все http-запросы подпрограмм контроллера

#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();
            });
            ...................
        }