Обработка неполных параметров в Microsoft.AspNetCore.Routing.Patterns

При работе с ASP.NET Core и маршрутизацией вы можете столкнуться с исключением «Microsoft.AspNetCore.Routing.Patterns.RoutePatternException: в файле есть неполный параметр». Это исключение генерируется, когда шаблон маршрута содержит неполный параметр, что означает, что заполнитель в шаблоне маршрута указан неправильно. В этой статье мы рассмотрим различные методы обработки этого исключения и предоставим примеры кода, иллюстрирующие каждый подход.

Метод 1: проверка параметров маршрута во время настройки
Один из способов предотвратить исключение «RoutePatternException» — проверить параметры маршрута во время настройки. Вы можете использовать класс RoutePatternдля анализа и проверки шаблона маршрута перед добавлением его в конфигурацию маршрутизации. Вот пример:

using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Patterns;
public void Configure(IEndpointRouteBuilder endpoints)
{
    var routeTemplate = "/api/{controller}/{action}/{id:int}";

    try
    {
        var routePattern = RoutePatternFactory.Parse(routeTemplate);
        endpoints.MapControllerRoute("default", routeTemplate);
    }
    catch (RoutePatternException ex)
    {
        // Handle the exception appropriately
    }
}

Метод 2: реализация пользовательского фильтра исключений
Другой подход заключается в реализации пользовательского фильтра исключений, который перехватывает «RoutePatternException» и корректно его обрабатывает. Вы можете создать класс, реализующий интерфейс IExceptionFilter, и переопределить метод OnException. Вот пример:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Routing.Patterns;
public class RoutePatternExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        if (context.Exception is RoutePatternException)
        {
            // Handle the exception appropriately
            context.Result = new NotFoundResult();
            context.ExceptionHandled = true;
        }
    }
}

Чтобы использовать собственный фильтр исключений, зарегистрируйте его в методе ConfigureServicesвашего класса Startup:

services.AddControllers(options =>
{
    options.Filters.Add<RoutePatternExceptionFilter>();
});

Метод 3: укажите значение по умолчанию для неполных параметров.
Если вы хотите указать значение по умолчанию для неполных параметров, вы можете использовать параметр defaultsпри определении шаблона маршрута. Вот пример:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller}/{action}/{id:int?}",
        defaults: new { id = 0 });
});

При указании id:int?в шаблоне маршрута параметр idстановится необязательным, и если он не указан, будет использоваться значение по умолчанию 0.

В этой статье мы рассмотрели различные методы обработки исключения RoutePatternException в Microsoft.AspNetCore.Routing.Patterns при обнаружении неполных параметров в шаблонах маршрутов. Проверяя параметры маршрута во время настройки, реализуя собственный фильтр исключений или предоставляя значения по умолчанию для неполных параметров, вы можете корректно обработать это исключение и обеспечить плавную маршрутизацию в приложениях ASP.NET Core.