ASP.NET接口中Guid参数为何传入默认值?
你遇到的问题是:路由路径中包含有效的Guid值,但方法参数id始终是全0的空Guid,而手动创建Guid是正常的。ASP.NET Core默认支持Guid类型的路由参数绑定,不需要额外配置,问题通常出在路由匹配或参数绑定的细节上,以下是具体排查和解决步骤:
代码场景复现
你的接口代码:
[HttpGet] [Route("{id}")] public Task<ActionResult<Model?>> Get(Guid id) { return ReadModel(id); }
请求URL为https://localhost:7685/api/Model/798f2724-c01b-4836-9603-5b64acaed464,Request.Path显示正确,但id参数为00000000-0000-0000-0000-000000000000。
排查与解决方法
显式指定参数绑定源
在参数上添加[FromRoute]特性,明确告知框架从路由路径中获取该参数,避免绑定源歧义:public Task<ActionResult<Model?>> Get([FromRoute] Guid id)检查控制器的路由前缀
确认控制器类上的路由前缀是否正确,比如控制器是否标注了:[Route("api/[controller]")] public class ModelController : ControllerBase { // ... }控制器前缀
api/Model加上方法路由{id},刚好匹配请求路径api/Model/{Guid},如果前缀错误,会导致路由匹配异常,参数无法正确绑定。排查路由冲突
检查控制器内是否存在其他Get方法,其路由模板与当前方法冲突。例如存在无参数的[HttpGet]方法,或者其他路由模板也能匹配api/Model/{Guid}的情况,导致框架匹配到错误的方法,进而参数未被赋值。确认路由配置完整性
确保项目的路由配置正确启用了属性路由:
在Program.cs中需包含:app.MapControllers(); // 启用属性路由如果使用的是传统约定路由,可能无法正确识别属性路由的模板。
总结
ASP.NET Core无需额外配置即可解析Guid类型的路由参数,全0Guid的问题基本都是路由匹配错误或绑定源不明确导致的,按上述步骤逐一排查即可解决。
内容的提问来源于stack exchange,提问作者Andy

