Атрибут Маршрутизация не существующих маршрутов - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть проект с маршрутизацией атрибутов, такой как:

[Route("home")]
public class HomeController : Controller
{
     [HttpPost]
     public IActionResult Post(int id)
     {
     }

     [HttpGet]
     public IActionResult Get()
     {
     }
}

Теперь я хочу перехватить все запросы Get / Post / Put, для которых не указан маршрут.Так что я могу вернуть ошибку, перенаправить на домашнюю страницу и тому подобное.Это возможно с AttributeRouting или я должен использовать обычную маршрутизацию при запуске?И как там будет выглядеть «несуществующий» маршрут?

1 Ответ

0 голосов
/ 25 апреля 2018

По умолчанию сервер возвращает код состояния HTTP 404 в качестве ответа на запросы, которые не обрабатываются каким-либо промежуточным программным обеспечением (маршрутизация атрибутов / соглашений является частью промежуточного программного обеспечения MVC).

В общем, что вы всегда можете сделатьзаключается в добавлении некоторого промежуточного программного обеспечения в начале конвейера, чтобы перехватывать все ответы с кодом состояния 404 и выполнять пользовательскую логику или изменять ответ.

На практике вы можете использовать существующий механизм, предоставляемый ASP.NET Core, называемый StatusCodePages * 1007 промежуточного слоя *.Вы можете зарегистрировать его непосредственно как необработанное промежуточное программное обеспечение с помощью

public void Configure(IApplicationBuilder app)  
{
    app.UseStatusCodePages(async context =>
    {
        context.HttpContext.Response.ContentType = "text/plain";
        await context.HttpContext.Response.WriteAsync(
            "Status code page, status code: " + 
            context.HttpContext.Response.StatusCode);
    });

    //note that order of middlewares is importante 
    //and above should be registered as one of the first middleware and before app.UseMVC()

Промежуточное программное обеспечение поддерживает несколько методов расширения, например, следующие (различие хорошо объяснено в этой статье ):

app.UseStatusCodePages("/error/{0}");
app.UseStatusCodePagesWithRedirects("/error/{0}");
app.UseStatusCodePagesWithReExecute("/error/{0}");

где "/error/{0}" - это шаблон маршрутизации, который может быть любым, и его параметр {0} будет представлять код ошибки.

Например, для обработки 404 ошибок вы можете добавить следующее действие

[Route("error/404")]
public IActionResult Error404()
{
    // do here what you need
    // return custom API response / View;
}

или общее действие

[Route("error/{code:int}")]
public IActionResult Error(int code)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...