Обработка протокола активации Uri, которая выбрасывает UriFormatException

Я создаю приложение, которое состоит из веб-просмотра, который показывает веб-сайт. Веб-сайт будет переходить к протоколу (используя JavaScript window.location = ...). Я пытаюсь подключиться к этому протоколу, чтобы я мог проанализировать данные, которые приложение отправляет мне. Проблема в том, что сайт использует этот протокол:

scheme://key1=value&key2=value&key3=value...

Это не действительный Uri в соответствии с System.Uri:

System.UriFormatException: Invalid URI: The hostname could not be parsed.

Я не могу изменить веб-сайт, поэтому я застрял в этом неверном формате. Я пытался использовать событие UnsupportedUriSchemeIdentified, но, поскольку я могу получить только объект Uri, он мгновенно падает, когда я пытаюсь получить доступ к Uri.

Я также попытался объявить протокол и обработать событие в методе App.OnActivation. Но еще раз, я могу получить доступ только к Uri, который мгновенно вылетает из приложения.

После этого я попытался использовать Reflection для непосредственного извлечения строки из WebViewUnsupportedUriSchemeIdentifiedEventArgs, но я не мог найти какие-либо частные поля.

Изменить: Я также попытался загрузить страницу с помощью HttpClient, а затем заменить недействительный URI на действительный, но это нарушает остальную часть сайта, потому что JS зависит от window.location, который не устанавливается должным образом при использовании webView.NavigateToString(...)

Итак, как мне получить доступ к данным Uri? Я не могу изменить веб-сайт, но я могу ввести JavaScript через WebView, если это абсолютно необходимо.

2 ответа

У вас есть ошибка в формате протокола. Вот в основном формат, который вы должны использовать:

scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

В вашем случае вы пропускаете часть хоста. Если он пуст, вы можете оставить его пустым - в этом случае ваш URI будет иметь тройную косую черту:

scheme:///key1=value&key2=value&key3=value...

Если вы еще не решили, вот мое решение. Сначала измените HTML в веб-представлении.

window.location = direct('scheme://key1=value&key2=value&key3=value...');

используйте эту функцию, и в этой функции отправьте эту ссылку на веб-сайт, такой как URL shortner, и получите короткий URL, и теперь вы получите URI в событии WebViewUnsupportedUriSchemeIdentified.

Вы можете использовать что-то подобное

 Cache.Insert("1234", TextBox1.Text, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero);

Cache.Get("1234").ToString();
Другие вопросы по тегам