ASP.NET:获取 *real* 原始 URL

Posted

技术标签:

【中文标题】ASP.NET:获取 *real* 原始 URL【英文标题】:ASP.NET: Get *real* raw URL 【发布时间】:2010-10-21 08:42:27 【问题描述】:

在 ASP.NET 中,有没有办法获取 real 原始 URL?

例如,如果用户浏览到“http://example.com/mypage.aspx/%2F”,我希望能够获得“http://example.com/mypage.aspx/%2F”而不是“http://example.com/mypage.aspx//”。

我当然想要一种干净的方式来做到这一点,但我可以接受一种使用反射或访问晦涩属性的 hacky 方法。

目前,我尝试在 Authorization-header 中使用 uri(有效),但我不能依赖它始终存在。

编辑:

我真正想做的是能够区分“http://example.com/mypage.aspx/%2F”和“http://example.com/mypage.aspx/%2F%2F”。

看起来 ASP.NET 首先将“%2F%2F”转换为“//”,然后将斜杠转换为单个斜杠。

所以只是重新编码是行不通的。

【问题讨论】:

【参考方案1】:

以下代码适用于我:

IServiceProvider serviceProvider = (IServiceProvider)HttpContext.Current;
HttpWorkerRequest workerRequest = (HttpWorkerRequest)serviceProvider.GetService(typeof(HttpWorkerRequest));
string realUrl = workerRequest.GetServerVariable("HTTP_URL");

请注意,这只适用于在 IIS 上运行而不是在 f.x 下运行。 ASP.NET 开发服务器!

感谢Lucero 在另一个线程中的回答,感谢Zhaph 将我指向该线程。

【讨论】:

这是正确的解决方案。它解决了路径中存在编码时的问题。服务器变量中的 HTTP_URL 将显示解码版本,此解决方案提供正确的编码版本。 这也返回了 IIS Express 下的预期结果【参考方案2】:

Request.RawUrl 将返回应用程序相对路径(包括查询字符串信息),而Request.Url 将返回完整路径(包括查询字符串信息)。

有关详细信息,请参阅“Making sense of ASP.NET paths”。

【讨论】:

【参考方案3】:

另见:

Get the exact url the user typed into the browser

【讨论】:

【参考方案4】:

我无法对此进行测试,因为它仅适用于 IIS,而不适用于 Visual Studio 中的 ASP.NET 开发服务器,但请尝试:

Request.ServerVariables[ "HTTP_URL" ]

【讨论】:

这为我返回了预期的结果,尽管它确实需要结合 HTTP_HOST 和 HTTP_QUERY 来获取 URL 的其余部分。【参考方案5】:

从请求中获取url,只对查询字符串部分进行urlencode,然后将它们连接起来

【讨论】:

【参考方案6】:

我不能在这里测试,但这可能是你需要的:

Request.Url.AbsoluteUri

【讨论】:

【参考方案7】:

嗯,你可以把它编码回 url 编码的版本。

【讨论】:

【参考方案8】:
 Server.htmlEncode(Request.RawUrl);

原始 URL 定义为 URL 中域信息之后的部分。在 URL 字符串 http://www.contoso.com/articles/recent.aspx 中,原始 URL 是 /articles/recent.aspx。原始 URL 包括查询字符串(如果存在)。

另见:link text

【讨论】:

Request 中的任何 URL 都可能已被清除,Request.ServerVariables["HTTP_URL"] 更准确。

以上是关于ASP.NET:获取 *real* 原始 URL的主要内容,如果未能解决你的问题,请参考以下文章