如何在Windows窗体应用程序和WebBrowser控件之间进行通信

时间:2011-12-09 12:10:18

标签: c# asp.net winforms webbrowser-control viewmodel

是否有任何机制可以将数据从包含的Windows窗体应用程序推送到Web浏览器控件中。具体来说,webbrowser控件包含一些knockout.js,我想允许一些外部事件,例如更改本地文件系统中的某些文件来更新knockout viewModel。

目前我已经开始使用这个工作了,在webbrowser控件中使用JS发出一个longpolling jsonp请求到我在windows窗体应用程序中运行的微博客服务器(注意这不是网页的地方)因为jsonp本身就是服务器。而且,微网络服务器基本上只是一个httpListner)。当表单应用程序收到文件更改事件时,它会通过微型网络服务器返回响应并更新淘汰视图模型。

问题是这一切都感觉很脆弱 - 如果文件事件变得越来越快,它们就会开始被跳过 - 看起来我的微型网络服务器试图将多个结果返回到同一个流。我可以解决这个问题,但整体看起来很讨厌和脆弱。

问题是:我错过了任何更简单的方法让包含应用程序信号(即传递一些JSON)到webbrowsercontrol中运行的网页(没有页面刷新!)

1 个答案:

答案 0 :(得分:1)

你可以创建一个元素,比如一个带有id的div

<div id='external-json' data-bind='jsonHandler : {}' style='display:none'></div>

然后从winforms app中将json写入此div ..

var myJson = "{test : 1}";
this.browser.Document.Body.GetElementById("external-json").innerText = myJson; 

您甚至可以创建一个敲除自定义绑定来对此

作出反应
    ko.bindingHandlers.jsonHandler = {
        update: function(element, valueAccessor) {
        //do something with the json
        var json = element.innerText;
        var obj = eval(json); //hmm
        alert(obj.test); 
    }
};

这显然是一个简单的例子,您可能会大量改进这个想法,您可能需要一个消息队列,可能需要在客户端脚本中调用一个函数而不是使用该元素。