У меня есть этот контроллер и действие:
[Route("categories")]
public class CategoriesController : Controller
{
[HttpGet("{*category:regex(^[[A-Za-z0-9/]]*$)}")]
public IActionResult ViewObjectsInCategory([FromRoute] string category)
{
return Ok(category ?? ""); // for now, just echo what you inputted
}
}
Я собираюсь принять следующие URL-маршруты:
/categories
/categories/abc
/categories/abc/def
/categories/abc/def/1234/ghi
По сути, пользователь может поместить в URL все, что он хочет после /categories
(включая ничего), при условии, что это заглавная буква, строчная буква, цифра или косая черта. Если пользователь вводит недопустимый символ, он должен получить 404.
Отправленный код правильно перенаправит мои перечисленные запросы на все, кроме первой записи (/categories
). Он возвращает 404, когда я хочу, чтобы он выполнил свое действие.
Глядя на логи, ядро ASP.Net абсолютно отвергает путь к моим действиям:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://localhost:5000/categories
dbug: Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware[0]
Wildcard detected, all requests with hosts will be allowed.
dbug: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[4]
The request path /categories does not match a supported file type
dbug: Microsoft.AspNetCore.Routing.Matching.DfaMatcher[1001]
1 candidate(s) found for the request path '/categories'
dbug: Microsoft.AspNetCore.Routing.Matching.DfaMatcher[1003]
Endpoint 'MyApp.Controllers.CategoriesController.ViewObjectsInCategory (MyApp)' with route pattern 'categories/{*category:regex(^[A-Za-z0-9/]*$)}' was rejected by constraint 'category':'Microsoft.AspNetCore.Routing.Constraints.RegexInlineRouteConstraint' with value '(null)' for the request path '/categories'
dbug: Microsoft.AspNetCore.Routing.Matching.DfaMatcher[1004]
Endpoint 'MyApp.Controllers.CategoriesController.ViewObjectsInCategory (MyApp)' with route pattern 'categories/{*category:regex(^[A-Za-z0-9/]*$)}' is not valid for the request path '/categories'
dbug: Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware[2]
Request did not match any endpoints
Что можно сделать, чтобы этот атрибут маршрута принимал оба «пустых» значения (/categories
), а также проверял, что, если оно присутствует, любое введенное пользователем значение не имеет недопустимых символов?