如何使用Asp.net?

时间:2018-01-22 02:58:33

标签: c# asp.net url encoding

我想要编码以下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

但是我从用户界面中收到错误说:

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))); 

但它没有用。

有没有办法在不收到此类错误的情况下对网址进行编码? 我希望输出类似于我的第二个结果,但我想看到页面本身,而不是错误页面。

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

1 个答案:

答案 0 :(得分:0)

您可以使用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编码 - 因此您也会发现第一个输出也有效,但如果您尝试通过例如,一些C#代码,它会失败。)

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

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

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