从 Microsoft.AspNetCore.Http.HttpRequest 获取原始 URL
Get raw URL from Microsoft.AspNetCore.Http.HttpRequest
Asp.Net 5 (vNext) 中的 HttpRequest
class 包含(除其他外)有关请求的 URL 的已解析详细信息,例如 Scheme
、Host
、Path
等
不过,我还没有发现任何公开原始请求的地方 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
Asp.Net 5 (vNext) 中的 HttpRequest
class 包含(除其他外)有关请求的 URL 的已解析详细信息,例如 Scheme
、Host
、Path
等
不过,我还没有发现任何公开原始请求的地方 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