ChatGPT解决这个技术问题 Extra ChatGPT

从 Microsoft.AspNetCore.Http.HttpRequest 获取原始 URL

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

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

我可以取回原始 URL,而不必从 HttpRequest 上可用的组件中拼凑起来吗?

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

M
Matt DeKrey

看起来您无法直接访问它,但您可以使用框架构建它:

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

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

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

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


这不再适用于 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()”。
L
Leo Hendry

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

如果您真的想要实际的原始 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
S
Shadi Alnamrouti

在 .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

g
giammin

其他解决方案不太适合我的需求,因为我直接想要一个 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)。
j
jor

以下扩展方法从 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;
}

U
Uwe Keim

这个扩展对我有用:

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}";
    }
}

S
Smartkid

在 ASP.NET 5 beta5 中:

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