Статьи

Совет WP7: всегда кодируйте URL-адреса для WebBrowserTask

Как написано в заголовке, не забывайте всегда кодировать URL, который вы хотите открыть во внешнем браузере, через WebBrowserTask .

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

Но вернемся к проблеме.

Как открыть URL в веб-браузере WP7 из вашего приложения

Ну, это легко

WebBrowserTask task = new WebBrowserTask();
task.URL = "http://feedtso.com/";
task.Show();

Просто создайте задачу, установите URL (помните, что это строка, а не Uri) и вызовите метод Show.

Добавление параметров в смесь

Но с более сложными URL-адресами, с параметрами или когда параметр является другим URL-адресом, все идет не так.

В своей программе чтения новостей я позволил пользователям открывать запись во внешнем браузере также в текстовом режиме, используя сторонний сервис от Instapaper , называемый mobilizer .

Чтобы это работало, вам нужно вызвать URL http://www.instapaper.com/m и добавить параметр с именем u с URL страницы, которую вы хотите «мобилизовать».

Но для того, чтобы добавить его в качестве параметра, URL-адрес должен быть закодирован, чтобы сделать его легальным как uri: поэтому, если вы хотите увидеть текстовую версию функций FeedTso, вы должны вызвать следующий URL-адрес (который кодируется в urlen-коде ) :

http://www.instapaper.com/m?u=http%3A%2F%2Ffeedtso.com%2Ffeatures.html

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

Я посмотрел на свойство URL на MSDN, и он говорит:

 

Примечание :
URL-адреса, содержащие специальные символы, должны быть экранированы перед назначением их свойству. Используйте метод Uri.EscapeDataString для экранирования строки URL.

Я думал, что это применимо только к обычной кодировке URL, которую вы делаете, если ваши параметры имеют специальные символы. Но, очевидно, это означает, что все должно быть UrlEncoded, даже после того, как уже закодировал параметр.

Вероятно, задача веб-браузера всегда декодирует URL-адрес перед отправкой в ​​браузер, и в моем случае он также декодировал кодировку параметров URL-адреса и приводил к сбою навигации.

Как перейти к Ури с параметрами?

Суть в том, что вы должны снова закодировать его перед передачей URL-адреса в WebBrowserTask.

string serviceUrl = "http://www.instapaper.com/m?u=";
string destinationUrl = "http://feedtso.com/features.html";
string escapedUrl = serviceUrl + Uri.EscapeDataString(destinationUrl);
WebBrowserTask task = new WebBrowserTask();
task.URL = Uri.EscapeDataString(escapedUrl);
task.Show();

Кодирование во второй раз приведет к неверному URL:

 

http%3A%2F%2Fwww.instapaper.com%2Fm%3Fu%3Dhttp%253A%252F%252Ffeedtso.com%252Ffeatures.html

 

Но, видимо, это единственный способ заставить WebBrowserTask работать правильно.

Завершение

Это также может показаться, что одному из разработчиков Gotcha WP7, возможно, придется смириться с этим, поскольку я не думаю, что Microsoft когда-либо сможет это исправить, так как это сломает все приложения, которые уже обходят это странное поведение.