Добавление ограничения с помощью HttpGet (...) не работает в ASP.Net Core

Я новичок в основной платформе ASP.NET. Я работаю над примером приложения, где я собираю некоторые ежедневные данные из сервиса. Моя подпись API, как показано ниже -

[HttpGet("daily/{state}/{year}/{month}/{day}")]
public async Task<IActionResult> Daily([FromRoute] string state, [FromRoute] int year, [FromRoute] int month, [FromRoute] int day)
{
    //...
}

Мое требование ограничить state параметр до 3 символов и все заглавные буквы.

Итак, я сделал это -

[HttpGet("daily/{state:regex(A-Z):maxlength(3)}/{year}/{month}/{day}")]
public async Task<IActionResult> Daily([FromRoute] string state, [FromRoute] int year, [FromRoute] int month, [FromRoute] int day)
{
    //...
}

Если я добавлю эти ограничения на маршрут, я получаю страницу не найдена ошибка.

Это работает нормально, если я не ставлю никаких ограничений.

Обновлено - см. Следующий снимок экрана с VS2017. Я передаю URL как http://localhost:51208/api/daily/mah/2018/08/13 и все же IsValid ModelState возвращает true. Зачем?

2 ответа

То, что вы можете сделать, это более понятным способом - создать модель для вашего запроса на получение.

  public class DailyModel
    {
        [Required]
        [RegularExpression("^[A-Z]{3}$", ErrorMessage ="State should be length of 3 and all in Upper Case")]
        public string State { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }
        public int Day { get; set; }
    }

И примените аннотацию данных к вашим полям, как показано выше. А на вашем контроллере вы можете отправить недопустимое сообщение о состоянии модели, если запрос недействителен.

  [Route("api/[controller]")]
    public class TestController : Controller
    {

        [HttpGet("daily/{state}/{year}/{month}/{day}")]
        public async Task<IActionResult> Daily([FromRoute] DailyModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

          ...
        }
    }

Не найдено, потому что вызываемый URL, скорее всего, не соответствует ограничению регулярного выражения.

Подумайте о проверке вашего регулярного выражения.

Простой пример

^[A-Z]{1,3}$

Соответствует одному символу в диапазоне: [AZ] от 1 до 3 раз.

Это означает, что он будет совпадать с A в ZZZ

Если длина должна быть ровно 3 символа, удалите диапазон

^[A-Z]{3}$

Который будет соответствовать AAA в ZZZ

Поэтому обновите ограничение соответствующим образом.

[HttpGet("daily/{state:regex(^[[A-Z]]{{3}}$)}/{year:int}/{month:int}/{day:int}")]

Обратите внимание, что токены регулярного выражения должны быть экранированы. Например, \, {, }, [, ] символы необходимо экранировать, удваивая их, чтобы экранировать символы-разделители параметра Routing.

Маршрутизация ссылок в ASP.NET Core. Регулярные выражения для экранирования регулярного выражения.

Для желаемого матча

GET {host}/daily/ABC/2019/01/20
Другие вопросы по тегам