Был ли FxCop неправ, говоря мне использовать класс .Net Uri? - PullRequest
3 голосов
/ 21 февраля 2009

Получая URL-адрес для чего-либо в корзине Amazon S3, он может добавить в конец подпись, чтобы подтвердить, что у пользователя есть разрешение на просмотр объекта, и URL выглядит так:

https://mybucket.amazonaws.com/mykey?AWSAccessKeyId=myaccesskey& Истекает = 1235241261 & Signature = t5vFBWXaN0DvVaWfck9n2% 2fmTzOU% 3d

Эти URL-адреса возвращались из моей библиотеки S3 в виде строковых объектов, и я передавал их таким образом. Недавно я запустил свой код через FxCop, и он рекомендовал использовать класс Uri для передачи URL-адресов. Я воспользовался советом FxCops и изменил свой URL string properties на Uri properties. Казалось, что все работает нормально, пока гораздо позже я не заметил, что не все объекты были возвращены успешно.

Причиной проблемы было то, что функция Uri class ToString() вернула бы немного другую версию URL:

https://mybucket.amazonaws.com/mykey?AWSAccessKeyId=myaccesskey& Истекает = 1235241261 & Signature = t5vFBWXaN0DvVaWfck9n2 / mTzOU =

Мое решение состояло в том, чтобы использовать свойство OriginalString класса Uri. Но что-то не так в этом, и у меня есть два вопроса,

  • Должен ли я воспользоваться советом FxCops и использовать класс Uri?
  • Должен ли Amazon понять, что URL-адреса могут проходить через много рук и не зависеть от того, возвращаются ли они точно так же?

При использовании класса .Net Uri я могу быть уверен, что мои URL-адреса всегда действительны, но, похоже, допускаются более тонкие ошибки.

Ответы [ 2 ]

4 голосов
/ 10 октября 2009

Я согласен с Dthrasher. FxCop не ошибся. Но FxCop не говорит вам о боли, которую вы можете испытывать при использовании System.Uri, особенно с ASP.NET. Я только что написал статью, которая поможет вам лучше подготовиться к использованию этого класса, что может несколько запутать:

http://web.archive.org/web/20091015051451/http://www.pluralsight.com/community/blogs/keith/archive/2009/10/10/did-fxcop-tell-you-to-use-system-uri.aspx

4 голосов
/ 21 февраля 2009

FxCop не ошибается, предлагая использовать класс Uri вместо необработанной строки. Использование класса Uri обеспечивает безопасность типов и несколько полезных методов анализа.

System.Uri автоматически выполняет некоторое кодирование и декодирование строки запроса. Похоже, вы не ожидали такого поведения, и это вызвало некоторые проблемы. Я бы рекомендовал проверить, какие символы следует экранировать в URI в соответствии со стандартом HTTP.

Вот статья в Википедии, которая более подробно описывает процентное кодирование или URL-кодирование.

Ваша конкретная проблема заключается в том, что %2f является escape-последовательностью в URL-адресе для символа косой черты /. Класс System.Uri расшифровал эту последовательность для вас.

System.Uri, конечно, не идеален. Рик Страл недавно рассказал о различных вариантах кодировки строк Uri в своем блоге.

...