在没有使用任何其它外部依赖方法时,我们可以通过以下方法来实现。

这里汇总了两个方法,推荐方法一:

public static string GetUrl(HttpRequest request)	
{	    
var httpfeature = request.HttpContext.Features.Get<IHttpRequestFeature>();	    
return httpfeature.RawTarget;	
}

这种方法的好处是不紧把参数取出来也可以报描点等信息也取过来。例如获取到的可能是如下的样子:https://lebang2020.cn/details/2101274kx4axoe.html#tp1

方法二简单也可行:

public static string GetUrl(HttpRequest request)
        {
            return string.Concat(request.Scheme, "://", request.Host, request.Path, request.QueryString);
        }

以上就是lebang2020.cn给大家带来的详细内容!

链 接

两种方法的对比与注意事项

方法一通过 IHttpRequestFeature.RawTarget 拿到请求行的原始目标,包含完整的查询串,适合日志记录、回调地址拼装等需要"原样还原"的场景;方法二用 Scheme、Host、Path、QueryString 手动拼接,语义清晰但默认不含 PathBase。

  • 反向代理(Nginx)后部署时,Scheme 与 Host 需要配置 ForwardedHeaders 中间件才能取到真实值,否则拿到的是内网地址;
  • Fragment(井号后的锚点)不会随 HTTP 请求发送到服务端,服务端永远取不到;
  • 记录跳转来源时建议同时保存 RawTarget 与自定义 Header,便于排查。

相关阅读

参考资料