Сохранять URL-адрес при использовании класса URI

Я пытаюсь получить общедоступную информацию профиля из LinkedIn. Для этого я должен предоставить http://api.linkedin.com/v1/people/url=public-profile-url, где URL-адрес общедоступного профиля ДОЛЖЕН быть закодирован в URL.

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

URI должен быть:

http://api.linkedin.com/v1/people/url=http%3a%2f%2fwww.linkedin.com%2fin%2fiftachragoler

но есть:

http://api.linkedin.com/v1/people/url=http://www.linkedin.com/in/iftachragoler

Таким образом, я получаю "Bad Request" из LinkedIn.

Есть ли способ, чтобы Uri/UriBuilder не мог декодировать этот URL?

Ответ 1

Есть отчет об этом на Microsoft connect. По умолчанию экранированные косые черты не допускаются из-за соображений безопасности.

http://connect.microsoft.com/VisualStudio/feedback/details/94109/

Ссылается оттуда:

Я пытаюсь использовать LinkedIn api, для которого мне нужна следующая ссылка: http://api.linkedin.com/v1/people/url=http%3A%2F%2Fwww.linkedin.com%2Fin%2Fyourlinkedinname:public

Как вы видите, поле url должно быть экранировано. Как это решить?

Ответ:

В настоящее время мы не разрешаем выводить косые черты и точки в путь, потому что это обычный способ атаковать сервер, когда URI схема поддерживает сжатие пути.

Но есть вкладка с обходными способами. Один из них для .NET 4 - это добавить app.config:

Для .NET 4.0 вы можете управлять этим через файл конфигурации:

http://msdn.microsoft.com/en-us/library/bb882619.aspx

http://msdn.microsoft.com/en-us/library/ee656539.aspx

<configuration>
<uri>
    <schemeSettings>
     <clear/>
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/>
    </schemeSettings>
</uri>
</configuration>

Для .NET перед .NET был конструктором для класса Uri с параметром "dontEscape". Для .NET 4 он устарел.

Ответ 2

Что произойдет, если вы удвоите его?

http://api.linkedin.com/v1/people/url=http%253a%252f%252fwww.linkedin.com%252fin%252fiftachragoler