【问题标题】:Get raw URL from Microsoft.AspNetCore.Http.HttpRequest从 Microsoft.AspNetCore.Http.HttpRequest 获取原始 URL
【发布时间】:2015-03-23 02:25:40
【问题描述】:

Asp.Net 5 (vNext) 中的 HttpRequest 类包含(除其他外)有关请求 URL 的解析详细信息,例如 SchemeHostPath 等。

尽管如此,我还没有发现任何公开原始请求 URL 的地方 - 只有这些解析值。 (在以前的版本中有Request.Uri

我能否在不必将 HttpRequest 上可用的组件拼凑起来的情况下取回原始 URL?

【问题讨论】:

  • 一个错误似乎已在早些时候提交但已关闭...您可能可以检查它的详细信息,如果您对此感觉更强,可以更新它的详细信息:github.com/aspnet/HttpAbstractions/issues/110
  • @KiranChalla:我有点理解他们的观点,尽管它确实让我想知道 RawURL 在以前的版本中是什么。我猜他们目前所展示的关于方案、主机等的内容可以从服务器端对请求的处理中推测出来,而不是请求本身的任何内容。
  • 你试过 ToString() 吗?

标签: request uri asp.net-core


【解决方案1】:

貌似不能直接访问,但是可以使用框架构建:

Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)

您也可以使用上述作为扩展方法。

这会返回string 而不是Uri,但它应该可以达到目的! (这似乎也起到了UriBuilder 的作用。)

感谢@mswietlicki 指出它只是被重构而不是丢失!还要@C-F 指出我的答案中的命名空间变化!

【讨论】:

  • 这不再适用于 beta-5。我没有好的选择,或者会更新我的答案。
  • 我相信这是一种真正的扩展方法——您只需导入命名空间并调用GetEncodedUriGetDisplayUri,具体取决于您的用例。
  • 使用 Microsoft.AspNet.Http.Extensions;还有那个 Request.GetDisplayUrl()
  • 正确的命名空间现在是 Microsoft.AspNetCore.Http.Extensions
  • 对于 ASP.NET Core 1.0,将 using "Microsoft.AspNetCore.Http.Extensions" 添加到您的 Razor 视图。要获取 url,请使用“@Context.Request.GetDisplayUrl()”。
【解决方案2】:

添加 Nuget 包/使用:

using Microsoft.AspNetCore.Http.Extensions; 

(在 ASP.NET Core RC1 中,这是在 Microsoft.AspNet.Http.Extensions 中)

那么你可以通过执行得到完整的http请求url:

var url = httpContext.Request.GetEncodedUrl();

var url = httpContext.Request.GetDisplayUrl();

取决于目的。

【讨论】:

  • ASP.NET Core RC2 现在可用吗?
  • 查看源代码,这些显然做了一些编码/解码,所以这不会是原始网址。此外,IIS 有时会在访问 Kestrel 之前更改 url,例如%2F -> /.
  • @TomStickel 不确定你在说什么......我使用它们都没有问题。确保您的文件中有using 指令,如答案中所述,因为这些不是“正常”方法,而是扩展方法。
  • @TomStickel 公平。只是注意到为 ASP.NET Core 2.2 安装了 Microsoft.AspNetCore.All 包(也在 2.0 上测试过),这对我来说很好。
【解决方案3】:

如果您真的想要 实际的原始 URL,您可以使用以下扩展方法:

public static class HttpRequestExtensions
{
    public static Uri GetRawUrl(this HttpRequest request)
    {
        var httpContext = request.HttpContext;

        var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();

        return new Uri(requestFeature.RawTarget);
    }
}

此方法利用请求的RawTarget,它不会出现在HttpRequest 对象本身上。此属性是在 ASP.NET Core 1.0.0 版本中添加的。确保您运行的是该版本或更新版本。

注意!此属性公开 原始 URL,因此它尚未被解码,如文档所述:

此属性在内部不用于路由或授权决策。它尚未经过 UrlDecoded,使用时应小心。

【讨论】:

  • 我正在使用带有完整 .NET Framework 的 ASP .NET Core。这似乎对我不起作用(RawTarget 未在IHttpRequestFeature 上定义)。你能想出一个替代方案吗?
  • RawTarget 已添加到 1.0 版本中,back in may。你确定你运行的是最新版本吗?
  • 如果使用 IIS 进行托管,IIS 有时会在访问 Kestrel 之前更改 url。一个例子是 %2F 被解码为 /。
  • 这是迄今为止的权威答案。
  • 这似乎给出了 URL 路径而不是整个 URL
【解决方案4】:

在 .NET Core 剃须刀中:

@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)

你也可以用第二行代替:

@Context.Request.GetDisplayUrl() //Use to display the URL only

【讨论】:

    【解决方案5】:

    其他解决方案不太适合我的需求,因为我直接想要一个 URI 对象,我认为在这种情况下最好避免字符串连接(也)所以我创建了这个扩展方法而不是使用 UriBuilder 和也适用于像http://localhost:2050这样的网址:

    public static Uri GetUri(this HttpRequest request)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = request.Path.ToString(),
            Query = request.QueryString.ToString()
        };
        return uriBuilder.Uri;
    }
    

    【讨论】:

    • 好一个。我还使用可选参数改进了您的解决方案。因此,我可以控制要检索的 URI 的哪一部分。例如,仅主机或没有查询字符串的完整路径等。
    • @user3172616 好主意!
    • (80) 应该是 (-1)。当您在“主机”标头中省略端口的 https 方案时,这将生成错误的 Uri(例如https://myweb:80/(-1) 将是https://myweb)。
    【解决方案6】:

    下面的扩展方法从pre-beta5 UriHelper复现了逻辑:

    public static string RawUrl(this HttpRequest request) {
        if (string.IsNullOrEmpty(request.Scheme)) {
            throw new InvalidOperationException("Missing Scheme");
        }
        if (!request.Host.HasValue) {
            throw new InvalidOperationException("Missing Host");
        }
        string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
        return request.Scheme + "://" + request.Host + path + request.QueryString;
    }
    

    【讨论】:

      【解决方案7】:

      这个扩展对我有用:

      using Microsoft.AspNetCore.Http;
      
      public static class HttpRequestExtensions
      {
          public static string GetRawUrl(this HttpRequest request)
          {
              var httpContext = request.HttpContext;
              return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
          }
      }
      

      【讨论】:

        【解决方案8】:

        在 ASP.NET 5 beta5 中:

        Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
            request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
        

        【讨论】:

          猜你喜欢
          • 2018-02-09
          • 1970-01-01
          • 1970-01-01
          • 2010-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-07
          相关资源
          最近更新 更多