如何使用Asp.net对URL进行编码?

5

我有以下一行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编码作为我的学校项目的一部分,因此如果我可以得到解决方案,那就太好了。谢谢。

4
你的问题并不太合理。我们不会对URL进行编码,只会对URL的参数进行编码。因此,当完整的URL作为另一个URL的参数传递时,我们才会对其进行编码。或许你应该解释一下你想要做什么,这样我们可以帮助你找到最好的方法来实现。 - Racil Hilan
好的,抱歉我不知道URL不能被编码,我从我的讲义中读到它可以被编码。我想要实现的是对通过URL传递的参数进行编码。比如带有我的会话解析和命令参数的URL,有没有办法在我的URL中对它们进行编码?@RacilHilan - depressedGirl
你能写一个例子来说明我如何使用它吗?也许可以使用我在问题中提供的其中一个URL来说明我应该如何正确地做。你提供的链接非常模糊,没有提供任何示例。我之前使用过那种方法,但它没有对我的URL进行编码。@ADyson - depressedGirl
我尝试了你建议的方法,但是我得到了相同的错误页面。@ADyson - depressedGirl
"你可以看到我的观点b)样本URL参数来自我与会话使用的那个。你的问题中有3个不同的示例。第一个是使用 countriesAttractions.aspx?=。第二个是Response.Redirect("specificServices.aspx?service=" + Session["service"].ToString().Trim() + "&price=" + Session["price"].ToString().Trim()));,但您从未显示任何会话_值_是什么。第三个是使用Response.Redirect("specificAttractions.aspx?attraction=" + HttpUtility.HtmlEncode(Convert.ToString(e.CommandArgument)));。" - ADyson
显示剩余25条评论
1个回答

2
您可以使用 HttpUtility 类中的 UrlEncode 或 UrlPathEncode 方法来实现所需功能。请参阅文档: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 - depressedGirl
简而言之,不,我不知道,主要是因为我看不到你传递给“price”参数的确切数据,或者你的其他页面如何使用该参数以及它与你的数据列表之间的关系。我无法阅读你的项目、运行时数据、屏幕或思维。如果你有另一个问题,你需要在StackOverflow上创建另一个问题,并包括所有必要的细节(包括我刚刚描述的信息。你的思维内容是可选的 :-))。如果你在评论中链接到你的新问题,我可以看一下。谢谢。 - ADyson
哦,我明白了,那就好,非常感谢。我正在使用另一种编码方法来处理那行代码,这不会影响我的数据列表。@ADyson - depressedGirl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接