В некоторых случаях регулярное выражение ограничения маршрута ядра webapi asp.net игнорируется - PullRequest
0 голосов
/ 08 марта 2019

Это приложение построено на ASP.Net Core (.NET Core 2.1).Я пытаюсь настроить контроллер (см. RiskController ниже) для поддержки следующего через http get:

  1. Получение по идентификатору (/api/risk/0000001) должно возвращать один график риска
  2. Поиск по имени (/api/risk/some%20company%20name) должен возвращать массив результатов поиска
  3. Проверка идентификатора (/api/risk/0000002/validate) должна возвращать true / false, если идентификатор существует

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

Объявление моего контроллера:

    [Produces( "application/json" )]
    [Route( "api/[controller]" )]
    [Authorize]
    [ApiController]
    public class RiskController : ControllerBase

Действие get by ID:

        // GET api/risk/0000001
        [HttpGet( "{riskId:regex(^\\d{{7}}|(SI[[PG]]|JPA|DEM)\\d{{4}})}", Order = 0 )]
        public async Task<IActionResult> Get( string riskId ) { ... }

Поискдействие по имени:

        // GET api/risk/some%20company%20name
        [HttpGet( "{name:length(2,30)}", Order = 1 )]
        public async Task<IActionResult> Search( string name ) { ... }

Действие проверки идентификатора:

        // GET api/risk/0000001/validate
        [HttpGet( "{riskId:regex(^\\d{{7}}|(SI[[PG]]|JPA|DEM)\\d{{4}})}/[action]", Order = 2 )]
        public async Task<IActionResult> Validate( string riskId )

Идентификаторы всегда представляют собой строки из 7 цифр или начинаются с SIP, SIG, JPA или DEM, за которыми следуют 4 цифры (однанапример: «0000002», «SIP0003», «SIG0004», «JPA0005» ИЛИ «DEM0006»).

Теперь дело, которое меня расстроило, - это когда пользователь входит, скажем, nine цифра в поле поиска по имени.Поиск по имени должен вызвать API с /api/risk/000000019.И это должно быть обработано приведенным выше действием find by name .Но регулярное выражение ограничения для вышеуказанного действия get by ID по какой-то причине соответствует девятизначному числу, которое, конечно, не находит запись.И пользователь видит ошибку.Однако, если пользователь вводит, скажем, четырехзначное число в поле поиска по имени, вызов /api/risk/0004 соответствует приведенному выше действию поиска по имени и работает как следует.,

Не должна ли часть \d{7} ограничения действия get by ID regex соответствовать ровно 7 цифрам и больше?/api/risk/000000019 определенно не соответствует второй половине регулярного выражения: (SI[PG]|JPA|DEM)\d{4}!

Любой совет?

1 Ответ

0 голосов
/ 08 марта 2019

Регулярное выражение здесь:

 // GET api/risk/0000001
 [HttpGet( "{riskId:regex(^\\d{{7}}|(SI[[PG]]|JPA|DEM)\\d{{4}})}", Order = 0 )]

Просто проверяет, что оно «начинается с» выражения, рассмотрите возможность добавления проверки конца строки. Рассмотрим разницу между следующими упрощенными регулярными выражениями:

  1. ^\d{7}
  2. ^\d{7}$

Примечание 1 будет соответствовать 0000001, 0000001234 и 0000001ABC.

Пока вы, вероятно, после 2, что соответствует 0000001.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...