为了账号安全,请及时绑定邮箱和手机立即绑定

在某些情况下,asp.net 核心 webapi 路由约束正则表达式似乎被忽略了

在某些情况下,asp.net 核心 webapi 路由约束正则表达式似乎被忽略了

C#
慕哥9229398 2022-10-15 15:05:59
此应用程序基于 ASP.Net Core (.NET Core 2.1) 构建。我正在尝试配置一个控制器(见RiskController下文)以通过 http get 支持以下内容:按 ID ( /api/risk/0000001) 获取应返回单个风险图按名称查找 ( /api/risk/some%20company%20name) 应返回搜索结果数组/api/risk/0000002/validate如果 id 存在,验证 ID ( ) 应返回真/假非常简单的东西,当参数值非常适合每个动作时,这一切都有效。我正在使用正则表达式来限制动作,这很有帮助。我的控制器声明:    [Produces( "application/json" )]    [Route( "api/[controller]" )]    [Authorize]    [ApiController]    public class RiskController : ControllerBase通过 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 ) { ... }验证 ID 操作:        // 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 )ID 始终为 7 位字符串,或以 SIP、SIG、JPA 或 DEM 开头,后跟 4 位数字(例如:“0000002”、“SIP0003”、“SIG0004”、“JPA0005”或“DEM0006”之一)。现在让我感到困惑的是当用户输入时,在按名称搜索字段中输入一个九位数字。按名称搜索应使用/api/risk/000000019. 这应该由上面的find by name action来处理。但是,由于某种原因,上述get by ID 操作的约束正则表达式与九位数字匹配,这当然找不到条目。并且用户看到一个错误。但是,如果用户在“按名称搜索”字段中输入一个四位数字,则调用会/api/risk/0004与上述按名称搜索操作相匹配并按其应有的方式工作。对通过 ID 操作正则表达式获取\d{7}的约束部分不应该完全匹配 7 位数字并且不再匹配吗?当然不匹配正则表达式的后半部分:!/api/risk/000000019(SI[PG]|JPA|DEM)\d{4}有什么建议吗?
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

这里的正则表达式:

 // 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,00000012340000001ABC

虽然您可能在2which 之后匹配0000001


查看完整回答
反对 回复 2022-10-15
  • 1 回答
  • 0 关注
  • 181 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号