当密码或用户名字段包含特殊字符时,System.Uri无法解析

And*_*rew 8 c# parsing uri

以下代码抛出System.UriFormatException:

var uri = new UriBuilder("ftp://user:pass#word@ftp.somewhere.com:21/fu/bar.zip");
Run Code Online (Sandbox Code Playgroud)

System.UriFormatException:无效的URI:由于存在冒号(':')而无法解析端口,因此需要端口.

从密码字段中删除#符号可以解决问题.

  1. #符号的有效字符在密码字段?
  2. 有办法逃避这个吗?
  3. 这是Uri类解析例程中的已知错误吗?
  4. 如何解决这个问题 - 假设您无法更改密码?;-)

谢谢,安德鲁

Pau*_*ane 12

您应该可以使用%23代替.

百分号后跟两位十六进制数字是如何在URL中转义字符.23是ASCII表中的散列/井号符号的十六进制值.

您应该通过编码整个用户名和密码字段来解决此问题,而不是解决此特定问题.你应该可以这样做System.Web.HttpUtility.UrlEncode(参考System.Web程序集):

string username = ...
string password = ...
string url = string.Format("ftp://{0}:{1}@ftp.example.com:21/fu/bar.zip",  HttpUtility.UrlEncode(username),
                                                                           HttpUtility.UrlEncode(password));
Run Code Online (Sandbox Code Playgroud)