ASP.NET Core API中生成邮箱确认链接返回Null的问题求助
我来帮你排查这个问题,Url.Link返回Null通常和路由配置、参数匹配有关,咱们一步步来解决:
检查路由名称是否正确
Url.Link的第一个参数是路由的名称,不是Action的名称。你代码里用的是"recuperar",得确认你的项目路由配置(Startup.cs或Program.cs)里有没有定义这个名称的路由。比如正确的路由配置应该是这样的:// 在Program.cs中配置MVC路由 app.MapControllerRoute( name: "recuperar", // 这里的名称要和Url.Link里的第一个参数完全一致 pattern: "{controller=User}/{action=ConfirmEmailAddress}/{token?}/{email?}" );如果路由名称不匹配,Url.Link找不到对应的路由模板,就会返回Null。
确认路由参数是否匹配
你传递的参数Controller、Action、token、email,需要确保路由模板里包含这些参数(或者设置为可选参数,加?)。比如上面的模板里,token和email是可选的,这样才能和你传递的参数匹配上。尝试生成绝对路径的替代方案
如果路由名称配置容易出错,你可以改用Url.Action方法,并指定请求协议(http/https)来生成完整的绝对URL,这种方式不需要依赖路由名称,只要Controller和Action名称正确就行:var confirmationEmail = Url.Action( "ConfirmEmailAddress", "User", new { token = token, email = user.Email }, HttpContext.Request.Scheme // 指定协议,确保生成完整URL );排除HttpContext的问题
虽然你的方法是HttpPost控制器方法,HttpContext应该是可用的,但如果是在特殊环境下(比如后台任务)调用,Url.Link会因为没有HttpContext返回Null。不过你的场景是接口请求,这个可能性不大,但用上面的Url.Action方案也能规避这个问题。
另外你提到试过ActionLink,ActionLink是用来生成HTML<a>标签的,在API控制器里并不适用,因为API返回的是数据而非视图,所以用Url.Link或Url.Action才是正确的选择。
内容的提问来源于stack exchange,提问作者Leonardo Silva

