的HttpRequest
在Asp.Net 5(vNext)类包含(除其他事项外)大约的URL请求解析的细节,例如Scheme
,Host
,Path
等。
我还没有发现公开原始请求URL的任何地方-仅这些解析的值。(在以前的版本中有Request.Uri
)
是否可以不必从HttpRequest上可用的组件将原始URL拼凑起来就获取原始URL?
的HttpRequest
在Asp.Net 5(vNext)类包含(除其他事项外)大约的URL请求解析的细节,例如Scheme
,Host
,Path
等。
我还没有发现公开原始请求URL的任何地方-仅这些解析的值。(在以前的版本中有Request.Uri
)
是否可以不必从HttpRequest上可用的组件将原始URL拼凑起来就获取原始URL?
Answers:
看起来您无法直接访问它,但是可以使用框架进行构建:
Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)
您也可以将以上内容用作扩展方法。
这将返回astring
而不是a Uri
,但它应该达到目的!(这似乎也起到的作用UriBuilder
。)
感谢@mswietlicki指出它只是经过重构而不是丢失!还要@CF指出我的答案中的名称空间更改!
GetEncodedUri
或即可GetDisplayUri
。
添加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();
根据目的。
using
文件中包含指令,如答案中所述,因为它们不是“常规”方法,而是扩展方法。
如果您确实需要实际的原始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版本中添加的。确保您正在运行该版本或更高版本。
注意!该属性公开原始URL,因此未解码,如文档所述:
此属性内部不用于路由或授权决策。还没有经过UrlDecoded,因此在使用时应格外小心。
RawTarget
未在上定义IHttpRequestFeature
)。你能想到一个替代方案吗?
RawTarget
在1.0版本,加入早在5。您确定您正在运行最新版本吗?
在.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
其他解决方案不能很好地满足我的需求,因为我直接想要一个URI
对象,并且我认为在这种情况下最好避免使用字符串连接(因此),所以我创建了这种扩展方法,而不是使用a,UriBuilder
并且还可以与url一起使用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;
}
(80)
应该是(-1)
。如果您在https方案中的“主机”标头中省略了端口,则将生成错误的Uri(例如https://myweb:80/
,(-1)
它将是https://myweb
)。
以下扩展方法从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;
}
此扩展名对我有用:
使用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}";
}
}