Asp .Net Core 3.1 Web Api 捕获所有控制器子路由 http 请求

问题描述 投票:0回答:3

我想将控制器的路径捕获为字符串,以便处理每个请求:

     [ApiController]
        [Route("[controller]")]
        public class BackendController : ControllerBase
        {
            [Route("Backend/{url}")]
            public Task<HttpResponseMessage> CatchAll(string url)
            {
     var requestmessage = HttpContext.Request;
//Do stuff
            }
    }

我在 asp.net core 2.1 中发现了很多东西,但我没有设法让它与我的解决方案一起工作..

提前致谢

http asp.net-core controller asp.net-core-3.1 catch-all
3个回答
3
投票

您可以使用往返路由参数语法:

Route   Sample
/search/{*page}     /search/admin%2Fproducts (the forward slash is encoded)
/search/{**page}    /search/admin/products

我正在使用

CatchAll
模板来捕获我的 Echo 示例的所有路线和方法:

[ApiController]
[Route("{**catchAll}")]
public class EchoController : ControllerBase
{
    [Route("/{**catchAll}")]
    public IActionResult Echo()
    {
        return Ok();
    }
}

有关 Microsoft 文档

的更多信息

3
投票
    [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}");
        }
    }

上面代码的结果:

网址:https://127.0.0.1:5001/api/backend/GenericAction/product?id=100

回复:

url: product, queryString: ?id=100

网址:https://127.0.0.1:5001/api/backend/GenericAction/company?name=michael

回复:

url: company, queryString: ?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}");
        }
    }

0
投票

如果你想获取请求的路径,并处理每个请求,可以使用中间件。

这是一个演示:

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();
            });
            ...................
        }
© www.soinside.com 2019 - 2024. All rights reserved.