Uri.IsWellFormedUriString нужно обновить?
Я думаю, что, возможно, обнаружил ошибку в методе Uri.IsWellFormedUriString, возможно, потому, что он соответствует только стандартам RFC 2396 и RFC 2732, а не более новому RFC 3986, что делает два вышеупомянутых устаревшими.
Что я думаю, так это то, что любые символы, отличные от us-ascii, приводят к сбою, поэтому URL с такими символами, как æ, ø, ö или å, возвращают значение false. Поскольку такие символы теперь разрешены (их использует википедия), я думаю, Uri.IsWellFormedUriString должен их принять. Регулярное выражение ниже взято из RFC 3986.
Как вы думаете? Должен ли быть обновлен класс Uri?
В любом случае вот пример кода, который показывает ошибку:
static void Main(string[] args)
{
var urls = new []
{
@"/aaa/bbb/cccd",
@"/aaa/bbb/cccæ",
@"/aaa/bbb/cccø",
@"/aaa/bbb/cccå"
};
var regex = new Regex(@"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?");
Debug.WriteLine("");
foreach (var url in urls)
{
if (Uri.IsWellFormedUriString(url, UriKind.Relative))
Debug.WriteLine(url + " is a wellformed Uri");
if (regex.IsMatch(url))
Debug.WriteLine(url + " passed the Regex");
Debug.WriteLine("");
}
}
Выход:
/aaa/bbb/cccd is a wellformed Uri
/aaa/bbb/cccd passed the Regex
/aaa/bbb/cccæ passed the Regex
/aaa/bbb/cccø passed the Regex
/aaa/bbb/cccå passed the Regex
1 ответ
Вы должны изменить свою конфигурацию для поддержки RFC 3986 и RFC 3987. Это конфигурация, которую вы должны сделать:
<configuration>
<uri>
<idn enabled="All" />
<iriParsing enabled="true" />
</uri>
</configuration>
Взято отсюда http://msdn.microsoft.com/en-us/library/system.uri.aspx