Добавление ограничения с помощью 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