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

Asp 中的 HttpRequest类。Net 5(vNext)包含(在其他内容中)关于请求 URL 的解析细节,比如 SchemeHostPath等等。

但是,我还没有发现任何地方暴露了原始请求 URL ——只有这些经过解析的值。(在以前的版本中有 Request.Uri)

我是否可以不用从 HttpRequest 上可用的组件拼凑而获得原始 URL?

88711 次浏览

看起来你不能直接访问它,但是你可以使用框架来构建它:

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

您还可以将上面的代码用作扩展方法。

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

感谢@msteetlicki 指出它只是被重构了而不是丢失了!还有@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 Core RC1中,这是在 Microsoft. AspNet. Http. Extended 中)

然后您可以通过执行以下命令获得完整的 http 请求 URL:

var url = httpContext.Request.GetEncodedUrl();

或者

var url = httpContext.Request.GetDisplayUrl();

视乎目的而定。

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

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,在使用它时应该注意。

这个分机适合我:

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这样的 URL:

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 核心剃刀:

@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

对我来说,在.NET Core 6上检索基本 URL 的最佳方法

using Microsoft.AspNetCore.Http.Extensions;


var url = request.GetDisplayUrl();
var path = request.Path.ToString();
                      

string baseUrl = url.Replace(path, "");