从 Microsoft.AspNetCore.Http.HttpRequest 获取原始 URL
Posted
技术标签:
【中文标题】从 Microsoft.AspNetCore.Http.HttpRequest 获取原始 URL【英文标题】:Get raw URL from Microsoft.AspNetCore.Http.HttpRequest 【发布时间】:2015-03-23 02:25:40 【问题描述】:Asp.Net 5 (vNext) 中的 HttpRequest
类包含(除其他外)有关请求 URL 的解析详细信息,例如 Scheme
、Host
、Path
等。
尽管如此,我还没有发现任何公开原始请求 URL 的地方 - 只有这些解析值。 (在以前的版本中有Request.Uri
)
我能否在不必将 HttpRequest 上可用的组件拼凑起来的情况下取回原始 URL?
【问题讨论】:
一个错误似乎已在早些时候提交但已关闭...您可能可以检查它的详细信息,如果您对此感觉更强,可以更新它的详细信息:github.com/aspnet/HttpAbstractions/issues/110 @KiranChalla:我有点理解他们的观点,尽管它确实让我想知道 RawURL 在以前的版本中是什么。我猜他们目前所展示的关于方案、主机等的内容可以从服务器端对请求的处理中推测出来,而不是请求本身的任何内容。 你试过 ToString() 吗? 【参考方案1】:貌似不能直接访问,但是可以使用框架构建:
Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)
您也可以使用上述作为扩展方法。
这会返回string
而不是Uri
,但它应该可以达到目的! (这似乎也起到了UriBuilder
的作用。)
感谢@mswietlicki 指出它只是被重构而不是丢失!还要@C-F 指出我的答案中的命名空间变化!
【讨论】:
这不再适用于 beta-5。我没有好的选择,或者会更新我的答案。 我相信这是一种真正的扩展方法——您只需导入命名空间并调用GetEncodedUri
或GetDisplayUri
,具体取决于您的用例。
使用 Microsoft.AspNet.Http.Extensions;还有那个 Request.GetDisplayUrl()
正确的命名空间现在是 Microsoft.AspNetCore.Http.Extensions
对于 ASP.NET Core 1.0,将 using "Microsoft.AspNetCore.Http.Extensions" 添加到您的 Razor 视图。要获取 url,请使用“@Context.Request.GetDisplayUrl()”。【参考方案2】:
添加 Nuget 包/使用:
using Microsoft.AspNetCore.Http.Extensions;
(在 ASP.NET Core RC1 中,这是在 Microsoft.AspNet.Http.Extensions 中)
那么你可以通过执行得到完整的http请求url:
var url = httpContext.Request.GetEncodedUrl();
或
var url = httpContext.Request.GetDisplayUrl();
取决于目的。
【讨论】:
ASP.NET Core RC2 现在可用吗? 是的 - blogs.msdn.microsoft.com/webdev/2016/05/16/… 查看源代码,这些显然做了一些编码/解码,所以这不会是原始网址。此外,IIS 有时会在访问 Kestrel 之前更改 url,例如%2F -> /. @TomStickel 不确定你在说什么......我使用它们都没有问题。确保您的文件中有using
指令,如答案中所述,因为这些不是“正常”方法,而是扩展方法。
@TomStickel 公平。只是注意到为 ASP.NET Core 2.2 安装了 Microsoft.AspNetCore.All 包(也在 2.0 上测试过),这对我来说很好。【参考方案3】:
如果您真的想要 实际的原始 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,使用时应小心。
【讨论】:
我正在使用带有完整 .NET Framework 的 ASP .NET Core。这似乎对我不起作用(RawTarget
未在IHttpRequestFeature
上定义)。你能想出一个替代方案吗?
RawTarget
已添加到 1.0 版本中,back in may。你确定你运行的是最新版本吗?
如果使用 IIS 进行托管,IIS 有时会在访问 Kestrel 之前更改 url。一个例子是 %2F 被解码为 /。
这是迄今为止的权威答案。
这似乎给出了 URL 路径而不是整个 URL【参考方案4】:
在 .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
【讨论】:
【参考方案5】:其他解决方案不太适合我的需求,因为我直接想要一个 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;
【讨论】:
好一个。我还使用可选参数改进了您的解决方案。因此,我可以控制要检索的 URI 的哪一部分。例如,仅主机或没有查询字符串的完整路径等。 @user3172616 好主意!(80)
应该是 (-1)
。当您在“主机”标头中省略端口的 https 方案时,这将生成错误的 Uri(例如https://myweb:80/
,(-1)
将是https://myweb
)。【参考方案6】:
下面的扩展方法从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;
【讨论】:
【参考方案7】:这个扩展对我有用:
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.HosthttpContext.Request.PathhttpContext.Request.QueryString";
【讨论】:
【参考方案8】:在 ASP.NET 5 beta5 中:
Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
【讨论】:
以上是关于从 Microsoft.AspNetCore.Http.HttpRequest 获取原始 URL的主要内容,如果未能解决你的问题,请参考以下文章