3 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
對(duì)于路由驗(yàn)證,您應(yīng)該避免使用 for?input validation
。
不要對(duì)輸入驗(yàn)證使用約束。如果約束用于輸入驗(yàn)證,則無效輸入會(huì)導(dǎo)致 404 - Not Found 響應(yīng),而不是帶有相應(yīng)錯(cuò)誤消息的 400 - Bad Request。路線約束用于消除相似路線的歧義,而不是驗(yàn)證特定路線的輸入。
如果您想通過路由約束檢查輸入,您可以通過實(shí)現(xiàn)IRouteConstraint
.
DateRouteConstraint
public class DateRouteConstraint : IRouteConstraint
{
? ? public static string DateRouteConstraintName = "DateRouteConstraint";
? ? public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
? ? {
? ? ? ? object dateValue;
? ? ? ? if (values.TryGetValue("date", out dateValue))
? ? ? ? {
? ? ? ? ? ? DateTime date;
? ? ? ? ? ? string[] formats = { "yyyy-MM-dd" };
? ? ? ? ? ? if (DateTime.TryParseExact(dateValue.ToString(), formats,
? ? ? ? ? ? ? ? ? ? ? ? ? ? CultureInfo.InvariantCulture,
? ? ? ? ? ? ? ? ? ? ? ? ? ? DateTimeStyles.None, out date))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return false;
? ? }
}
登記DateRouteConstraint
services.AddRouting(options =>
{
? ? options.ConstraintMap.Add(DateRouteConstraint.DateRouteConstraintName, typeof(DateRouteConstraint));
});
使用案例
[HttpGet("{date:DateRouteConstraint}")]
public ActionResult<string> Get(DateTime date)
{
? ? return Ok();
}

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
這里有一個(gè)例子:
https://learn.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing#get-books-by-publication-date
使用 dotnet core 3 我必須轉(zhuǎn)義 { 和 } (使它們加倍),它很簡(jiǎn)單:
[HttpGet("{date:datetime:regex(\\d{{4}}-\\d{{2}}-\\d{{2}})}")]
public WeatherForecast GetForecast(DateTime date)
...

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
您不能將RegularExpression
屬性應(yīng)用于 a DateTime
,因?yàn)樗皇亲址?;該屬性僅對(duì)字符串有效。
您可以使用正則表達(dá)式路由約束,即[HttpGet("{date:regex(...)}")]
,但在這種情況下,您最好使用約束datetime
:[HttpGet("{date:datetime}")]
。
- 3 回答
- 0 關(guān)注
- 184 瀏覽
添加回答
舉報(bào)