You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:06:03