Core API Controller для перехвата всех неизвестных маршрутов - PullRequest
0 голосов
/ 13 июня 2019

У меня есть Core 2.2 API с кучей существующих контроллеров.То, что я сейчас пытаюсь сделать, это добавить новый контроллер, который действует аналогично универсальному маршруту, но только для этого контроллера (и не нарушает маршруты существующих контроллеров) .

В моем существующем контроллере я определяю маршруты как атрибуты контроллера

[Route("api/[controller]")]
[ApiController]
public class SandboxController : ControllerBase
{
    [HttpGet("Hello")]
    public IEnumerable<string> Hello()
    {
        return new string[] { "Hello World", TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")).ToString()};
    }
}

Для этого нового контроллера "catchall" мне нужно, чтобы он мог перехватывать любые Get, Post, Put, Delete, которые естьнаправлено на это .Например, этот маршрут контроллеров ../api/catchall.Если кто-то, где сделать сообщение в ../api/catchall/some/random/unknown/route, я пытаюсь поймать это и направить его в ../api/catchall/post.

До сих пор я был совершенно неудачен.Вот что я получил до сих пор:

В моем файле Startup.cs

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseAuthentication();

...

    app.UseMvc(routes =>
    {
        routes.MapRoute("default", "{controller=Sandbox}/{action=Hello}/{id?}");

        routes.MapRoute(
            name: "catchall",
            template: "{controller}/{*.}", 
            defaults: new { controller = "catchall", action = "post" });
    });

И контроллер перехвата:

[Route("api/[controller]")]
[ApiController]
public class CatchallController : ControllerBase
{
    [HttpPost("post", Order = int.MaxValue)]
    public IActionResult Post([FromBody] string value)
    {
        return Content("{ \"name\":\"John Doe\", \"age\":31, \"city\":\"New York\" }", "application/json");
    }
}

Любые идеи о том, как я могу получить этоработать?

1 Ответ

0 голосов
/ 13 июня 2019

Поймать все маршруты указаны с синтаксисом * или **. Поместите [Route("{**catchall}")] на действие, которое вы хотите, чтобы оно было уловочным. Это сделает перехват всех маршрутов для всех маршрутов с префиксом, указанным в атрибуте маршрута контроллера.

[Route("api/[controller]")]
[ApiController]
public class CatchallController : ControllerBase
{
    [Route("{**catchAll}")]
    [HttpPost("post", Order = int.MaxValue)]
    public IActionResult Post([FromBody] string value, string catchAll)
    {
        return Content("{ \"name\":\"John Doe\", \"age\":31, \"city\":\"New York\" }", "application/json");
    }
}

В приведенном выше примере это будет перехватывать api/catchall/anything/following/it и устанавливать для строки catchAll значение anything/following/it

Если вы хотите установить охват всего маршрута для всего сайта, вы можете использовать абсолютный URL

[Route("/{**catchAll}")]
public IActionResult CatchAll(string catchAll)
{

}

Это поймает любой маршрут, который не соответствует ни одному другому указанному маршруту.

...