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

Get raw URL from Microsoft.AspNetCore.Http.HttpRequest

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

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

我能否取回原始的 URL 而不必将其从 HttpRequest 上可用的组件拼凑起来?

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

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

你也可以使用上面的作为扩展方法。

这个returns一个string而不是一个Uri,但它应该达到目的! (这似乎也起到了 UriBuilder 的作用。)

感谢@mswietlicki 指出它只是被重构而不是丢失!还要@C-F 指出我的回答中的名称空间更改!

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

在 ASP.NET 5 beta5 中:

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

添加 Nuget 包/使用:

using Microsoft.AspNetCore.Http.Extensions; 

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

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

var url = httpContext.Request.GetEncodedUrl();

var url = httpContext.Request.GetDisplayUrl();

取决于目的。

如果您真的想要实际的、原始的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 版本中。确保您使用的是 运行 那个版本或更高版本。

注意! 这个 属性 暴露了 raw URL,所以它还没有被解码,如文档所述:

This property is not used internally for routing or authorization decisions. It has not been UrlDecoded and care should be taken in its use.

这个扩展对我有用:

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

其他解决方案不能很好地满足我的需求,因为我直接想要一个 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;
}

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