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

时间:2015-01-23 23:09:43

标签: request uri asp.net-core

Asp.Net 5(vNext)中的HttpRequest类包含(除此之外)有关请求URL的已解析详细信息,例如SchemeHost,{{1等等。

我还没有发现任何公开原始请求URL的地方 - 只有这些解析后的值。 (在之前的版本中有Path

我是否可以在不必将其与HttpRequest上可用的组件拼凑在一起的情况下获取原始URL?

8 个答案:

答案 0 :(得分:47)

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

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

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

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

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

答案 1 :(得分:33)

添加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();

取决于目的。

答案 2 :(得分:7)

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

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版本中。确保您正在运行该版本或更新版本。

注意!此属性公开原始网址,因此未经过解码,如文档中所述:

  

此属性不在内部用于路由或授权决策。它不是UrlDecoded,应该小心使用它。

答案 3 :(得分:4)

在ASP.NET Core 2.x剃刀页面中:

@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

答案 4 :(得分:3)

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

答案 5 :(得分:3)

其他解决方案不能很好地满足我的需求,因为我想直接使用URI对象,我认为在这种情况下最好避免字符串连接(也),所以我创建了这个扩展方法而不是使用{{ 1}}并且也适用于UriBuilder

等网址
http://localhost:2050

答案 6 :(得分:2)

此扩展适用于我:

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

答案 7 :(得分:0)

在ASP.NET 5 beta5中:

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