Uri.IsWellFormedUriString нужно обновить? - PullRequest
6 голосов
/ 24 мая 2011

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

12 голосов
/ 24 мая 2011

Вы должны изменить свою конфигурацию для поддержки RFC 3986 и RFC 3987. Это конфигурация, которую вы должны сделать:

<configuration>
  <uri>
  <idn enabled="All" />
  <iriParsing enabled="true" />
  </uri>
</configuration>

Взяты здесь http://msdn.microsoft.com/en-us/library/system.uri.aspx#CodeSnippetContainerCode5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...