【问题标题】:How to encode a URL using Asp.net?如何使用 Asp.net 对 URL 进行编码?
【发布时间】:2018-06-30 15:26:34
【问题描述】:

我有下面一行想要编码的 aspx 链接:

 Response.Redirect("countriesAttractions.aspx?=");

我试过以下方法:

 Response.Redirect(Encoder.UrlPathEncode("countriesAttractions.aspx?="));

这是我尝试过的另一种方法:

    var encoded = Uri.EscapeUriString("countriesAttractions.aspx?=");
    Response.Redirect(encoded);

两者都重定向到没有编码 URL 的页面:

http://localhost:52595/countriesAttractions?=

我尝试了第三种方法:

 Response.Redirect(Server.UrlEncode("countriesAttractions.aspx?="));

这次 url 本身被编码:

http://localhost:52595/countriesAttractions.aspx%3F%3D

但是,我从 UI 中收到一条错误消息:

HTTP Error 404.0 Not Found
The resource you are looking for has been removed, had its name changed, or 
is temporarily unavailable.
Most likely causes:
-The directory or file specified does not exist on the Web server.
-The URL contains a typographical error.
-A custom filter or module, such as URLScan, restricts access to the file.

另外,我想编码另一种涉及解析会话字符串的 URL:

Response.Redirect("specificServices.aspx?service=" + 
Session["service"].ToString().Trim() + "&price=" + 
Session["price"].ToString().Trim()));

我尝试将编码方法包含在上面的代码中的方法:

Response.Redirect(Server.UrlEncode("specificServices.aspx?service=" + 
Session["service"].ToString().Trim() + "&price=" + 
Session["price"].ToString().Trim()));

我使用的上述编码方法显示的结果与我以前的服务器 URL 编码方法收到的结果相同。我不确定如何以正确的方式对 url 进行编码而不会出错。

以及使用 CommandArgument 对 URL 进行编码:

Response.Redirect("specificAttractions.aspx?attraction=" + 
e.CommandArgument);

我尝试了以下编码:

Response.Redirect("specificAttractions.aspx?attraction=" + 
HttpUtility.HtmlEncode(Convert.ToString(e.CommandArgument))); 

但它没有工作。

有什么方法可以在不收到此类错误的情况下对 url 进行编码? 我希望输出类似于我的第二个结果,但我想查看页面本身而不是错误页面。

我尝试了在 stackoverflow 上找到的其他方法,例如自编码方法,但这些方法也不起作用。 在这种情况下,我将 AntiXSS 类库用于我尝试的方法,所以如果我可以使用 AntiXSS 库获得解决方案,那就太好了。 我需要将 URL 编码为我学校项目的一部分,所以如果我能得到解决方案,那就太好了。谢谢你。

【问题讨论】:

  • 你的问题没有多大意义。我们不对 URL 进行编码,我们只对 URL 的参数进行编码。因此,我们对完整 URL 进行编码的唯一时间是当它作为另一个 URL 的参数传递时。或许您应该解释一下您要做什么,以便我们帮助您找到最好的方法。
  • 好吧对不起,我不知道 URL 不能被编码,我从我的讲义中读到它可以被编码。我想要实现的是对通过 URL 传递的参数进行编码。例如带有会话解析和命令参数的 url,有什么方法可以在我的 URL 中对它们进行编码? @RacilHilan
  • 是的。 HttpUtility.UrlEncode 方法。它接受一个字符串并返回编码版本。因此,您可以为每个参数调用一次。 msdn.microsoft.com/en-us/library/…
  • 你能写一个我如何使用它的例子吗?也许可以使用我在问题中提供的网址之一来说明我如何以正确的方式做到这一点。您提供的链接非常模糊,没有提供任何示例。我以前使用过该方法,但它没有对我的网址进行编码。 @ADyson
  • 我尝试了您建议的方法,我得到了相同的错误页面。 @ADyson

标签: c# asp.net url encoding


【解决方案1】:

您可以使用 HttpUtility 类中的 UrlEncodeUrlPathEncode 方法来实现您所需要的。请参阅https://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode(v=vs.110).aspx 上的文档

但是,重要的是要理解,您不需要对整个 URL 字符串进行编码。您需要编码的只是 参数值 - 它可能包含在 URL 中无效的任意数据和字符。

要解释这个概念,请在一个简单的 .NET 控制台应用程序中运行以下命令:

string url = "https://www.google.co.uk/search?q=";
//string url = "http://localhost:52595/specificAttractions.aspx?country=";
string parm = "Bora Bora, French Polynesia";
Console.WriteLine(url + parm);
Console.WriteLine(url + HttpUtility.UrlEncode(parm), System.Text.Encoding.UTF8);
Console.WriteLine(url + HttpUtility.UrlPathEncode(parm), System.Text.Encoding.UTF8);
Console.WriteLine(HttpUtility.UrlEncode(url + parm), System.Text.Encoding.UTF8);

您将获得以下输出:

https://www.google.co.uk/search?q=Bora Bora, French Polynesia
https://www.google.co.uk/search?q=Bora+Bora%2c+French+Polynesia
https://www.google.co.uk/search?q=Bora%20Bora,%20French%20Polynesia
https%3a%2f%2fwww.google.co.uk%2fsearch%3fq%3dBora+Bora%2c+French+Polynesia

通过将这些粘贴到浏览器中并尝试使用它们,您很快就会看到什么是有效的 URL,什么不是。

(注意,当粘贴到现代浏览器中时,如果您的参数无效,它们中的许多会自动为您进行 URL 编码 - 所以您会发现第一个输出也有效,但如果您尝试通过某些 C# 调用它例如代码,它会失败。)

工作演示:https://dotnetfiddle.net/gqFsdK

您当然可以将输入的值更改为您喜欢的任何值。它们可以是硬编码的字符串,也可以是返回字符串的其他代码的结果(例如,从会话、数据库、UI 元素或其他任何地方获取)。

注意澄清 有效 URL 只是 URL 格式正确的字符串也很有用。它与实际存在的 URL 不同。如果您尝试使用 URL,它可能有效但不存在,或者可能有效但确实存在。

【讨论】:

  • 顺便说一句,我还有一个问题要问。我已经成功地使用其会话参数对以下 URL 行进行了编码。 Response.Redirect("specificServices.aspx?service=" + HttpUtility.UrlEncode(Session["service"].ToString().Trim(),Encoding.UTF8) + "&price="+ HttpUtility.UrlEncode(Session["price "].ToString().Trim(),Encoding.UTF8));但是,每当我尝试对“&price=”行进行编码时,重定向页面中的数据列表输出都不会显示。你碰巧知道为什么吗? @ADyson
  • 简而言之,不,我不知道,主要是因为我看不到您作为“价格”参数传入的确切数据,或者您的其他页面做了什么以及它如何尝试使用参数,或与您的数据列表有什么关系。我无法阅读您的项目、您的运行时数据、您的屏幕或您的思想。如果您还有其他问题,您需要在 StackOverflow 上创建另一个问题并包含所有必要的详细信息(包括我刚刚描述的信息。您的想法是可选的 :-))。如果您在此处评论链接到您的新问题,我可以看一下。谢谢。
  • 哦,我明白了,那就太好了,非常感谢。我对该行使用了另一种编码方法,它不会影响我的数据列表。 @ADyson
猜你喜欢
  • 1970-01-01
  • 2013-03-04
  • 2014-05-27
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2012-08-26
  • 1970-01-01
相关资源
最近更新 更多