处理抛出UriFormatException的Uri的协议激活

时间:2016-05-06 13:02:40

标签: c# windows-runtime win-universal-app

我制作了一个应用,其中包含一个显示网站的网页视图。该网站将导航到协议(使用javascript' s window.location = ...)。我试图加入该协议,因此我可以解析应用程序发送给我的数据。问题是网站使用这个协议:

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

根据System.Uri,这不是有效的Uri:

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

我无法更改网站,所以我坚持使用这种无效格式。我尝试过使用UnsupportedUriSchemeIdentified事件,但由于我只能从中获取Uri对象,因此当我尝试访问Uri时它会立即崩溃。

我还尝试声明协议,并在App.OnActivated方法中处理事件。但是再一次,我只能访问Uri,它会立即崩溃应用程序。

之后,我尝试使用Reflection直接从WebViewUnsupportedUriSchemeIdentifiedEventArgs拉出字符串,但我找不到任何私有字段。

编辑我还尝试使用HttpClient加载页面,然后用有效的uri替换无效的uri,但这会破坏网站的其余部分,因为JS依赖于窗口.location,使用webView.NavigateToString(...)

时未正确设置

那么如何访问Uri数据呢?我无法更改网站,但如果绝对不可能,我可以通过WebView注入JavaScript。

2 个答案:

答案 0 :(得分:0)

协议格式有错误。这基本上是您应该使用的格式:

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

在您的情况下,您省略了主持人部分。如果它是空的,你可以保持空 - 在这种情况下你的URI将有三倍的斜杠:

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

答案 1 :(得分:0)

如果你还没有解决它,这是我的解决方案。 首先在webview中更改html。

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

像这样使用并在该函数中将该链接发送到网站,如url shortner并获得一个简短的URL,现在您将在WebViewUnsupportedUriSchemeIdentified事件中获得一个uri。

你可以使用类似的东西

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

Cache.Get("1234").ToString();