System.Uri не может проанализировать, когда поле пароля или имени пользователя содержит специальный символ - PullRequest
7 голосов
/ 08 марта 2010

Следующий код выдает исключение System.UriFormatException:

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

System.UriFormatException: недопустимый URI: порт ожидался из-за наличия двоеточия (':'), но порт не может быть проанализирован. Удаление символа # из поля пароля решает проблему.

  1. Является ли символ # допустимым символом в поле пароля?
  2. Есть ли способ избежать этого?
  3. Это известная ошибка в процедуре синтаксического анализа класса Uri?
  4. Как можно обойти это - при условии, что вы не можете изменить пароль? ; -) * 1 021 *

Спасибо, Андрей

Ответы [ 2 ]

11 голосов
/ 08 марта 2010

Вместо этого вы можете использовать% 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));
1 голос
/ 08 марта 2010

Код должен быть закодирован, поскольку он считается специальным символом. Даже тогда не уверен, что это сработает. Никогда не пробовал.

...