AutoMapper 10.1.1在.NET Core 5中通过UrlResolver映射Url属性报错
问题根因
从报错栈可以直接定位问题出在UrlResolver.Resolve方法的Uri构造环节,linkGenerator.GetUriByRouteValues返回了空字符串,传入Uri构造函数触发了空参数异常,常见触发原因有三个:
- 路由名称不匹配:代码中写死的路由名
"ControllerName"是占位符,没有替换为你实际注册的接口路由名 - 路由参数不匹配:直接传入int类型的CarId作为路由值,没有指定参数名,默认只能匹配名为
id的路由参数,如果你的接口路由参数名是carId就会匹配失败 - 上下文配置缺失:没有注册
IHttpContextAccessor到DI容器,或者调用映射的代码不在HTTP请求处理流程内,导致HttpContext为空,无法生成完整链接
修复方案
1. 修正UrlResolver的路由生成逻辑
补全路由参数名,增加空校验避免无意义的空参数异常:
public Uri Resolve(object source, object destination, int sourceMember, Uri destMember, ResolutionContext context) { // 替换为你实际接口标注的RouteName,比如你GetCar详情接口加了[HttpGet("{carId}", Name = "GetCarDetail")]就填这个名称 const string TargetRouteName = "GetCarDetail"; // 路由参数名要和接口定义的参数名完全一致,大小写敏感 var uriString = linkGenerator.GetUriByRouteValues( httpContextAccessor.HttpContext!, TargetRouteName, new { carId = sourceMember } ); if (string.IsNullOrWhiteSpace(uriString)) { throw new InvalidOperationException($"生成CarId={sourceMember}的访问链接失败,请检查路由配置"); } return new Uri(uriString); }
2. 补全DI配置
在Startup.cs的ConfigureServices方法中添加以下注册逻辑:
// 注册HttpContext访问器 services.AddHttpContextAccessor(); // 注册自定义Resolver到DI容器,让AutoMapper可以正确构造实例 services.AddTransient<UrlResolver>(); // 确认AutoMapper的注册是用官方扩展方法,会自动从DI获取依赖 services.AddAutoMapper(typeof(MainMapperProfile));
3. 特殊场景兼容
如果你的映射逻辑可能在非HTTP请求上下文(比如后台任务、队列消费)中调用,可以改用生成相对路径+域名拼接的方式,避免依赖HttpContext:
// 示例:从配置读取固定域名拼接相对路径 var path = linkGenerator.GetPathByRouteValues(TargetRouteName, new { carId = sourceMember }); var uriString = $"{_appConfig.BaseDomain}{path}";
内容的提问来源于stack exchange,提问作者vcliment89
相关产品推荐
相关产品推荐

