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

Posted

技术标签:

【中文标题】从 Microsoft.AspNetCore.Http.HttpRequest 获取原始 URL【英文标题】:Get raw URL from Microsoft.AspNetCore.Http.HttpRequest 【发布时间】: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() 吗? 【参考方案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 现在可用吗? 是的 - blogs.msdn.microsoft.com/webdev/2016/05/16/… 查看源代码,这些显然做了一些编码/解码,所以这不会是原始网址。此外,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.HosthttpContext.Request.PathhttpContext.Request.QueryString";
    

【讨论】:

【参考方案8】:

在 ASP.NET 5 beta5 中:

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

【讨论】:

以上是关于从 Microsoft.AspNetCore.Http.HttpRequest 获取原始 URL的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?

mysql 主-主-从-从