拦截来自WebBrowser控件的流量并在WP8上提供我自己的数据

时间:2012-11-08 14:46:56

标签: http webbrowser-control windows-phone windows-phone-8

在我的Windows Phone 8应用程序中,我有一个WebBrowser控件,我希望能够重新路由所有http流量,这意味着我拦截了http GET并从我的应用程序提供数据。不仅是html,还包括所有流量(图像等)。我曾尝试使用WebRequest.RegisterPrefix来注册我自己的IWebRequestCreate,以便提供我自己的WebRequests。但是,似乎IWebRequestCreate I寄存器仅用于我在我自己的代码中实例化的WebClient,而不是WebBrowser控件。

我找到了这个帖子:

How to register own protocol using the WebBrowser control?

但似乎这种方法是不可能的。至少在Windows Phone 7中没有。我希望WP8能有更好的运气。或者也许完全不同的方法可行?

有人可以帮帮我吗?

编辑:正如以下Josh Mackey所建议的那样。我或许可以通过代理运行一切。不幸的是,我不确定如何在Windows Phone上的代码中设置代理以在webBrowser控件上使用。似乎WP上没有WebRequest.DefaultWebProxy和wininet.dll。有谁知道如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

正如您引用的链接所说:“WebBrowser控件将使用Windows Phone Internet Explorer浏览器的HTTP堆栈”,因此您无法拦截它。但是,代理方法可能有用吗?

使用套接字创建一个简单的Web服务器,您可以告诉WebBrowser控件访问它?

我从这里得到了这个想法:Windows phone WebBrowser.Navigating event form data

答案 1 :(得分:0)

使用WebBrowser的Navigating事件(可以取消)等更简单的解决方案怎么样。

你必须在提供内容时提供你自己的HTML(我认为这不会触发这个事件),但是你可以做这样的事情

private void webBrowser_Navigating(object sender, NavigatingEventArgs e)
{
    if (e.Uri.ToString().StartsWith("myprotocol://", StringComparison.InvariantCultureIgnoreCase))
    {
         e.Cancel = true; // Cancels the request
         // my custom code here 
         // (where I go get the content and push it into the browser control by
         //     webBrowser.NavigateToString("MyContent");
         // )
    }
}

这实际上应该适用于WP7和8。

其他一些事情:

1)您可能必须使用自己忙碌的小部件来指示应用程序正忙,因为一旦取消导航,内置的导航将不会出现

2)您需要记住将Web浏览器上的“IsScriptEnabled”属性设置为true(即如果您需要启用JavaScript,则默认为false,IMO很容易错过)

3)如果您需要在页面上进行后期处理,您还可以处理Navigated事件,该事件允许您在内容返回时覆盖内容(或对其进行更改)