在没有使用任何其它外部依赖方法时,我们可以通过以下方法来实现。
这里汇总了两个方法,推荐方法一:
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,便于排查。
相关阅读
- ASP.NET Core 获取客户端真实 IP 地址的几种方法
- Linux 上把 .NET Core 程序部署为 Systemd 系统服务
- C# 字符串转枚举类型的几种方法:Enum.Parse 与示例
- netcore System.InvalidOperationException