2009-02-21 4 views
3

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

https://mybucket.amazonaws.com/mykey?AWSAccessKeyId=myaccesskey& Истекает = 1235241261 & Подпись = t5vFBWXaN0DvVaWfck9n2% 2fmTzOU% 3d

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

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

https://mybucket.amazonaws.com/mykey?AWSAccessKeyId=myaccesskey& Expires = 1235241261 & Подпись = t5vFBWXaN0DvVaWfck9n2/mTzOU =

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

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

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

+0

Хм ... авансовый голосование и голосование по уже близко, я был бы признателен за любые комментарии о том, как я мог бы улучшить этот вопрос. – tpower

ответ

4

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

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

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

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

System.Uri не является совершенным, конечно. Недавно Рик Стралл рассказал о своем different options for Uri string encoding.

+0

В этом случае это была амазонка, которая сгенерировала URL-адрес, если они были подготовлены для немного другой кодировки? – tpower

+0

Я думаю, что Amazon делает правильную вещь, кодируя переднюю косую черту как «% 2f» в своей строке запроса. Было бы неплохо, если бы они придумали дизайн URI, который вообще избегал необходимости в escape-последовательностях, но иногда это невозможно. – dthrasher

+0

ОК, вы имеете в виду, что я должен URL-кодировать мой uri, прежде чем использовать его? – tpower

4

Я согласен с 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

 Смежные вопросы

  • Нет связанных вопросов^_^