Я думаю, что мог обнаружить ошибку в методе 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