请教如何在.Net winForm程序里跟Chrome的Javacsript进行数据传递?

jamex 2016-06-29 12:43:43
请教如何在.Net winForm程序里跟显示在Chrome中的web页面的Javacsript进行数据传递?

具体如下:
有2个系统,一个是.Net开发的 winForm程序(这个是我们组开发的),另一个系统是我们公司另一个开发组开发的Web应用程序,这个web 应用程序职能运行在Chrome浏览器上。
在我的Net开发的 winForm程序里,会用Process对象启动Chrome,并且用URL打开这个Web应用程序页面。

string path = GetChromePath();
Process p = new Process();

p.StartInfo.FileName = path;
p.StartInfo.Arguments = url;
p.StartInfo.UseShellExecute = true;

returnProcess = p;
rc = p.Start();

现在公司客户要求:
我的winForm程序和那个Chrome上的Web UI系统之间能够相互通讯,相互传递定制的消息数据。
1.比如:我的winForm程序窗体上有个文本框,Web系统页面上能够通知我的winForm程序,去更改窗体文本框的显示内容。
2.比如:Web系统页面上有个文本框,我的winForm程序能够通知Web系统页面去更改文本框的显示内容。

请问,要实现以上要求,我的winForm程序和那个Chrome上的Web UI系统,分别应该实施哪些编程技术?

能否具体指导一下或者给出关键的代码片段?
时间紧急,谢谢大家了!!!


...全文
504 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
fungchou 2016-07-06
  • 打赏
  • 举报
回复
建议还是Winform+cef,Winform程序不启动chrome,而是内嵌cef,把进程间通讯变成进程内通讯。这样解决逻辑看起来正常点。 参考: cef : Chromium Embedded Framework CefSharp:https://github.com/cefsharp/CefSharp/
wanghui0380 2016-07-06
  • 打赏
  • 举报
回复
可以在net4上不过比较麻烦点,你得在nuget的时候带上对应的版本号,一般来说都是先到nuget 项目库里查看历史版本和相对应的框架版本,然后根据需要选择signalr-self-host的 估计你可以选择 https://www.nuget.org/packages/Microsoft.AspNet.SignalR.SelfHost/2.0.0 https://www.nuget.org/packages/Microsoft.AspNet.SignalR.SelfHost/2.0.0-rc1
by_封爱 版主 2016-07-06
  • 打赏
  • 举报
回复
做一个websocket服务器 在本地exe运行. 然后在web中连接ws:127.0.0.1 然后 不就双向通讯了?? 就这么简单的事啊
jamex 2016-07-06
  • 打赏
  • 举报
回复
SignalR = WebApp.Start(ServerURI); 报这个错: Server failed to start. A server is already running on http://*:8081| Exception has been thrown by the target of an invocation. |Access is denied| at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Microsoft.Owin.Hosting.ServerFactory.ServerFactoryAdapter.Create(IAppBuilder builder) at Microsoft.Owin.Hosting.Engine.HostingEngine.StartServer(StartContext context) at Microsoft.Owin.Hosting.Engine.HostingEngine.Start(StartContext context) at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options) at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions options) at Microsoft.Owin.Hosting.WebApp.StartImplementation(IServiceProvider services, StartOptions options) at Microsoft.Owin.Hosting.WebApp.Start(StartOptions options) at Microsoft.Owin.Hosting.WebApp.Start(String url) at WinformServer.frmWinServer.StartServer()|mscorlib
jamex 2016-07-06
  • 打赏
  • 举报
回复
引用 26 楼 wanghui0380 的回复:
可以在net4上不过比较麻烦点,你得在nuget的时候带上对应的版本号,一般来说都是先到nuget 项目库里查看历史版本和相对应的框架版本,然后根据需要选择signalr-self-host的 估计你可以选择 https://www.nuget.org/packages/Microsoft.AspNet.SignalR.SelfHost/2.0.0 https://www.nuget.org/packages/Microsoft.AspNet.SignalR.SelfHost/2.0.0-rc1
另外,你有没有碰到权限的问题,我可以用本地管理员账号在winform里启动这个web server, 但是,我用一个普通windows 账号(不是管理员)运行我的window form程序,然后,那句WebApp.Start的语句就报错了。 private void StartServer() { try { SignalR = WebApp.Start(ServerURI); } catch (TargetInvocationException) { WriteToConsole("Server failed to start. A server is already running on " + ServerURI); //Re-enable button to let user try to start server again this.Invoke((Action)(() => ButtonStart.Enabled = true)); return; } this.Invoke((Action)(() => ButtonStop.Enabled = true)); WriteToConsole("Server started at " + ServerURI); } Exception has been thrown by the target of an invocation. mscorlib
jamex 2016-07-06
  • 打赏
  • 举报
回复
引用 26 楼 wanghui0380 的回复:
可以在net4上不过比较麻烦点,你得在nuget的时候带上对应的版本号,一般来说都是先到nuget 项目库里查看历史版本和相对应的框架版本,然后根据需要选择signalr-self-host的 估计你可以选择 https://www.nuget.org/packages/Microsoft.AspNet.SignalR.SelfHost/2.0.0 https://www.nuget.org/packages/Microsoft.AspNet.SignalR.SelfHost/2.0.0-rc1
我试了,可是最终它需要用到Microsoft.Owin 3.0这个类,但是这个类要用到.NET 4.5 /// <summary> /// Starts the server and checks for error thrown when another server is already /// running. This method is called asynchronously from Button_Start. /// </summary> private void StartServer() { try { SignalR = WebApp.Start(ServerURI); //这句话,出错 } catch (TargetInvocationException) { WriteToConsole("Server failed to start. A server is already running on " + ServerURI); //Re-enable button to let user try to start server again this.Invoke((Action)(() => ButtonStart.Enabled = true)); return; } this.Invoke((Action)(() => ButtonStop.Enabled = true)); WriteToConsole("Server started at " + ServerURI); } 我能把我的测试小程序的源代码发给你,你帮我看看吗?谢谢!
jamex 2016-07-05
  • 打赏
  • 举报
回复
引用 21 楼 wanghui0380 的回复:
A当然不必使用client,他可以直接通过hub跟B沟通的,A代码可以直接调用 GlobalHost.ConnectionManager.GetHubContext <你创建的hub类型>().Clients.All.send("我调用这个hub向全体已连接上的客户端的send函数推送这条信息") 上面是向客户端推送消息 至于接收消息,hub内部本身就能接收,至于接收后怎么处理,你自己就随意了
谢谢! 我现在碰到个.NET framework版本的问题, signalr-self-host 好像 必须要使用.NET 4.5以上版本(主要好像是OWIN必须要 .Net 4.5),我的Winform程序是.net 4.0的。 不知道能不能将 signalr-self-host 创建在 .NET 4.0的工程上? 谢谢!
小灰狼 2016-07-01
  • 打赏
  • 举报
回复
在你的 WinForm 应用程序中,使用 HttpListener 封装一下,变成一个简单的 HttpServer 然后,在你的 Chrome 中,加入 javascript,用 ajax 的方式向你这个本地 HttpServer 进行数据交换。但这个要求跨域操作,你在启动 Chrome 时必须加上参数 --disable-web-security
GitJiKe 2016-07-01
  • 打赏
  • 举报
回复
I really don't know what are you talking about?
wanghui0380 2016-06-30
  • 打赏
  • 举报
回复
当然我的项目是因为项目需要如此 就你的项目,都在本机。个人认为如果使用H5+本地数据存储, winfrom绕过沙箱直接改本地数据存储 也应该可以玩
wanghui0380 2016-06-30
  • 打赏
  • 举报
回复
提示一下,微软写的这个demo有个小毛病 他using 释放了,作为控制台程序,readline 阻塞了到没问题,不过你要转成winfrom,千万别using,宁愿手动释放,也别using自动释放(如果没有阻塞,一用Using,他自己释放了,web服务就挂了) 另外就是nuget的问题,微软策略现在的nuget都放的net框架的版本,所以你要nuget最好自己带你net框架能使用的owin和signalr版本
wanghui0380 2016-06-30
  • 打赏
  • 举报
回复
http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 这里有微软自己写demo和文档
wanghui0380 2016-06-30
  • 打赏
  • 举报
回复
没有问题,我其实目前就这么做滴 使用的东西为: owin self host,SignalR.Owin 使用owin self host是他可以让你的winform变成小型web服务器,既可以webapi,也可以提供SignalR hub 使用SignalR当然是为了双向通讯 当然解释一下为啥搞成这样,主要是前方运维的人员复杂(经常有人大半夜打电话过来问我怎么架设iis,怎么配置iis,实在是烦人)所以提供一个自启动滴winfrom他们就不用麻烦我了,当然这个系统本身也只是提供api,也无需大个头的web服务器,一个轻量的webapi框架够用了
jamex 2016-06-30
  • 打赏
  • 举报
回复
引用 11 楼 wanghui0380 的回复:
没有问题,我其实目前就这么做滴 使用的东西为: owin self host,SignalR.Owin 使用owin self host是他可以让你的winform变成小型web服务器,既可以webapi,也可以提供SignalR hub 使用SignalR当然是为了双向通讯 当然解释一下为啥搞成这样,主要是前方运维的人员复杂(经常有人大半夜打电话过来问我怎么架设iis,怎么配置iis,实在是烦人)所以提供一个自启动滴winfrom他们就不用麻烦我了,当然这个系统本身也只是提供api,也无需大个头的web服务器,一个轻量的webapi框架够用了
谢谢! 能否提供一个SignalR的简单示例程序以实现以上双向通讯的?谢谢!
wanghui0380 2016-06-30
  • 打赏
  • 举报
回复
A当然不必使用client,他可以直接通过hub跟B沟通的,A代码可以直接调用 GlobalHost.ConnectionManager.GetHubContext <你创建的hub类型>().Clients.All.send("我调用这个hub向全体已连接上的客户端的send函数推送这条信息") 上面是向客户端推送消息 至于接收消息,hub内部本身就能接收,至于接收后怎么处理,你自己就随意了
jamex 2016-06-30
  • 打赏
  • 举报
回复
引用 12 楼 wanghui0380 的回复:
当然我的项目是因为项目需要如此 就你的项目,都在本机。个人认为如果使用H5+本地数据存储, winfrom绕过沙箱直接改本地数据存储 也应该可以玩
对,是本机,如果采用H5+本地数据存储, winfrom绕过沙箱直接改本地数据存储的方法,请问又是如何做呢?是否也给个示例?谢谢!我想比较一下,看看那种方案更简单一些。 :)
jamex 2016-06-30
  • 打赏
  • 举报
回复
引用 17 楼 wanghui0380 的回复:
不需要,你只需在你现有的winform里面编写SignalR的代码就是 比如你可以在你任意一个form里面写startup代码,甚至你可以在 Program.cs里面去写web服务启动代码,然后在任意cs文件去继承hub编写hub对象
非常感谢! 因为我现在要实现我的2个已有程序(A 和 B)之间的双向通讯,所以,做法可以如下: 1. 修改程序A的代码,创建一个SignalR的web服务对象,并启动它(http://localhost:8080/signalr),并实现一个hub对象。 2. 修改程序A的代码,再创建一个SignalR的Client对象, 使它连接注册上A中创建的SignalR的web服务的hub对象。 3. 修改程序B的代码,也创建一个SignalR的Client对象, 使它也连接注册上A中创建的SignalR的web服务的hub对象。 4.这样,A和B的双向通讯,就可以通过同一个hub对象的中转来实现。 比如:A要传一个数据给B, 数据流过程是这样的: A SignalR Client --> A SignalR Server(Hub) --> B SignalR Client 我的理解对吗? 如果我的上面理解正确的话,还有一个问题想问一下:我能否不在程序A中创建SignalR的Client对象,而是直接使用A中的A SignalR Server(Hub) 对象,和B中的SignalR Client对象进行双向的数据传递?谢谢!
wanghui0380 2016-06-30
  • 打赏
  • 举报
回复
微软这demo只是一个演示,实际上signalr-self-host 你从名字上就能看出他是个独立宿主,可以用在任何地方,控制台程序可以用,你现有的winform可以用,你写个window service服务也一样可以用
wanghui0380 2016-06-30
  • 打赏
  • 举报
回复
不需要,你只需在你现有的winform里面编写SignalR的代码就是 比如你可以在你任意一个form里面写startup代码,甚至你可以在 Program.cs里面去写web服务启动代码,然后在任意cs文件去继承hub编写hub对象
jamex 2016-06-30
  • 打赏
  • 举报
回复
引用 14 楼 wanghui0380 的回复:
http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 这里有微软自己写demo和文档
我看了这个例子,就是说,除了我的2个已有的程序,我还得另外写一个SignalR的server程序,然后先运行它。 最后,我在将我的2个已有的程序改造成SignalR的client程序。是这样吗?
加载更多回复(10)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧