Думаю, я обнаружил ошибку в методе Uri.IsWellFformedUriString, возможно, потому, что он соответствует только стандартам RFC 2396 и RFC 2732 а не более новый RFC 3986 , который делает два вышеупомянутых устаревшими.
Я думаю, что случается, что любые символы, отличные от us-ascii, приводят к сбою, поэтому URL-адреса с такими символами, как æ, ø, ö или å в нем вернет false. Так как такие символы теперь разрешены ( wikipedia среди прочего их использует), я думаю, что Uri.IsWellFformedUriString должен их принять. Приведенное ниже регулярное выражение взято из 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