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


87

HttpRequest在Asp.Net 5(vNext)类包含(除其他事项外)大约的URL请求解析的细节,例如SchemeHostPath等。

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

是否可以不必从HttpRequest上可用的组件将原始URL拼凑起来就获取原始URL?


1
似乎早已提交了一个有关此问题的错误,但已关闭...您可以检查它的详细信息,如果您对此有所了解,可以用详细信息进行更新:github.com/aspnet/HttpAbstractions/issues/110
Kiran Challa 2015年

@KiranChalla:我有点他们的观点,尽管它的确使我想知道当时的早期版本中的RawURL是什么。我猜他们当前显示的有关方案,主机等的信息可以与服务器端对请求的处理分开,而不是请求本身的任何内容。
乔恩·埃格顿

您尝试过ToString()吗?
火星从

Answers:


82

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

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

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

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

感谢@mswietlicki指出它只是经过重构而不是丢失!还要@CF指出我的答案中的名称空间更改!


4
自beta-5起,该功能不再有效。我没有很好的选择,或者会更新我的答案。
马特·德克里

13
我相信这是一个真正的扩展方法-您只需导入名称空间并根据使用情况调用GetEncodedUri或即可GetDisplayUri
dlras2 2015年

42
使用Microsoft.AspNet.Http.Extensions; 以及那个Request.GetDisplayUrl()
mswietlicki

8
正确的命名空间现在为Microsoft.AspNetCore.Http.Extensions
CF

9
对于ASP.NET Core 1.0,将“ Microsoft.AspNetCore.Http.Extensions”添加到Razor视图中。要获取该URL,请使用“ @ Context.Request.GetDisplayUrl()”。
乔普

75

添加Nuget包/使用:

using Microsoft.AspNetCore.Http.Extensions; 

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

那么您可以通过执行以下命令获取完整的http请求网址:

var url = httpContext.Request.GetEncodedUrl();

要么

var url = httpContext.Request.GetDisplayUrl();

根据目的。


ASP.NET Core RC2现在可用了吗?
谢尔盖·G


从源头来看,它们显然会进行一些编码/解码,因此这将不是原始URL。同样,IIS有时会更改,有时会在到达Kestrel之前更改URL,例如%2F-> /。
丹尼尔·利奇

1
@TomStickel不确定您在说什么...使用它们中的任何一个都没有问题。确保您的using文件中包含指令,如答案中所述,因为它们不是“常规”方法,而是扩展方法。
尼克·默丁

1
@TomStickel公平。只是注意到,为ASP.NET Core 2.2安装了Microsoft.AspNetCore.All软件包(也在2.0上进行了测试),对我来说很好用。
尼克·默丁

16

如果您确实需要实际的原始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,因此在使用时应格外小心。


我正在将ASP .NET Core与完整的.NET Framework配合使用。这似乎对我不起作用(RawTarget未在上定义IHttpRequestFeature)。你能想到一个替代方案吗?
托马什Hübelbauer

1
RawTarget在1.0版本,加入早在5。您确定您正在运行最新版本吗?
khellang '16

1
如果使用IIS托管,则IIS有时会更改,然后在到达Kestrel之前更改URL。一个例子是%2F被解码为/。
丹尼尔·里奇

到目前为止,这是权威性的答案。
克里斯·马里西奇

这似乎是给URL路径而不是整个URL
伊恩·巴拉德

10

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

8

其他解决方案不能很好地满足我的需求,因为我直接想要一个URI对象,并且我认为在这种情况下最好避免使用字符串连接(因此),所以我创建了这种扩展方法,而不是使用a,UriBuilder并且还可以与url一起使用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;
}

1
好一个 我也用可选参数改进了您的解决方案。因此,我可以控制要检索的URI的哪一部分。例如,仅主机或没有查询字符串等完整路径
user3172616

@ user3172616好主意!
giammin

1
(80)应该是(-1)。如果您在https方案中的“主机”标头中省略了端口,则将生成错误的Uri(例如https://myweb:80/(-1)它将是https://myweb)。
IgorDražić19年

4

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

3

此扩展名对我有用:

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

0

在ASP.NET 5 beta5中:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.