Asp.Net 5(vNext)中的HttpRequest
类包含(除此之外)有关请求URL的已解析详细信息,例如Scheme
,Host
,{{1等等。
我还没有发现任何公开原始请求URL的地方 - 只有这些解析后的值。 (在之前的版本中有Path
)
我是否可以在不必将其与HttpRequest上可用的组件拼凑在一起的情况下获取原始URL?
答案 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);