65.9K
CodeProject 正在变化。 阅读更多。
Home

RESTful WCF + Azure AppFabric 服务总线 = 从浏览器访问远程桌面

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (42投票s)

2010年12月3日

CPOL

6分钟阅读

viewsIcon

78056

downloadIcon

2673

结合 RESTful WCF 和 Azure AppFabric 服务总线的技术, 以最少的代码实现对远程桌面的浏览器访问

引言

WCF RESTful 服务和 Azure AppFabric 服务总线协同工作,允许瘦客户端(浏览器)访问远程计算机;并且这仅通过极少的代码即可实现。所提出解决方案的数据流如图 1 所示。

简要技术说明

WCF REST 作为轻量级 Web 服务器,而服务总线则提供远程访问,解决了防火墙和动态 IP 地址的问题。本文介绍的一个小型应用程序采用了这两种技术。在目标计算机上运行的应用程序ScreenShare允许用户通过其浏览器查看和控制目标计算机的屏幕。客户端计算机不需要额外的安装或<object>标签组件(如 Applet 或 ActiveX)。

客户端的浏览器显示远程目标计算机屏幕的图像,并允许操作图像上的简单控件(如按钮和编辑框),即在一定程度上实现活动屏幕共享。由于本文仅作为概念演示,示例实现了最少的功能。它由ScreenShare.exe控制台应用程序和一个简单的RemoteScreen.htm文件组成。该应用程序提供

  • 一个简单的 Web 服务器
  • 屏幕捕获
  • 鼠标点击和向 Windows 控件输入文本

实现的自包含 RESTful WCF 服务能够接收浏览器生成的普通 HTTP 请求。该服务公开用于传输文本(text/html)和图像(image/jpeg)数据的终结点。这些终结点具有Relay绑定,以支持通过 Azure AppFabric 服务总线进行通信。这种通信使得在不同网络中运行、位于防火墙后面的动态 IP 地址的浏览器和目标计算机上的 WCF 服务之间能够建立连接。

代码示例

要运行示例,您首先需要为 Azure AppFabric 开设一个账户,创建一个服务命名空间(请参阅 MSDN 或例如 [1] 第 11 章),并在目标计算机上安装 Windows Azure SDK。在 Visual Studio 解决方案的App.config文件中(以及演示版的配置文件ScreenShare.exe.config中),需要将<sharedSecret>标签中的issuerNameissuerSecret属性值以及占位符SERVICE-NAMESPACE替换为您 Azure AppFabric 服务总线账户的相应值。然后生成并运行项目(或在演示版中运行ScreenShare.exe)。应用程序会在控制台中输出可通过其访问的 URL。

https://SERVICE-NAMESPACE.servicebus.windows.net/ScreenShare/RemoteScreen

ScreenShare应用程序的输出如图 2 所示。

现在您可以使用上述 URL 从浏览器访问目标计算机的屏幕。

如上所述,此示例仅仅是概念演示,其功能相当有限。目前,客户端可以在其浏览器中获得目标计算机屏幕的图像,并通过左键单击和在浏览器中输入的文本来控制目标计算机,然后将操作传回目标计算机。在浏览器中的图像上执行左键单击后,单击点的坐标将被传输到目标计算机,ScreenShare应用程序会在目标计算机屏幕的相同坐标处模拟单击。要传输文本,客户端应将鼠标光标移到所选控件的浏览器图像上(确保图像处于焦点状态),键入文本(键入第一个字符时,会出现一个文本框来容纳文本),然后按“Enter”键。输入的文本将被传输到目标计算机并放入相应的控件中。单击或传输文本后,浏览器中的图像将更新,以反映目标计算机上的变化。

ScreenShare配置文件包含两个控制其行为的参数。ScreenMagnificationFactor在将屏幕图像传输到浏览器之前更改其大小。此双精度类型参数的值可以在 01 之间,以平衡传输的屏幕图像的质量和大小。客户端可以通过浏览器中的“空格键”在全尺寸图像(ScreenMagnificatioFactor = 1)和当前缩放之间切换。SleepBeforeScreenCaptureMs设置目标计算机屏幕操作与其捕获之间的时间间隔(以毫秒为单位),以捕获由操作引起的变化。

ScreenShare应用程序可以服务于多个浏览器。其 WCF 服务行为由ConcurrencyMode.Single定义。此定义确保客户端调用被顺序服务,无需同步。ScreenShare应用程序为每个客户端(浏览器)支持具有状态的会话。目前,会话状态包含一个参数ScreenMagnificationFactor,因为当前图像大小可能因客户端而异。

浏览器

到目前为止,ScreenShare已在 Internet Explorer (IE)、Chrome、Firefox 以及 Android、Windows Phone 7 (WP7)、iPhone 和 Simbian 移动设备的浏览器上进行了测试。下面的图片显示了原始目标计算机屏幕(图 3)及其在 IE(图 4)以及 Android(图 5)和 WP7(图 6)模拟器中的图像片段。

移动设备浏览器中的屏幕图像以不同的放大倍率显示,因此分辨率也不同。

在 IE 和 Chrome 中取得了最佳效果。Firefox 显示初始图片,但随后无法响应(RemoteScreen.htm文件应进行更改以使 Firefox 更新图像源)。移动浏览器工作正常,但图像大小应进行调整,并且难以输入文本。实际上,htm文件以及应用程序本身都应进行调整,以至少支持最流行的浏览器(应用程序已知浏览器类型)。

讨论

本文中的示例绝不能与复杂的屏幕共享应用程序竞争。但所述方法的强大之处在于,理论上任何浏览器无需额外安装即可用于远程操作您的桌面。浏览器的能力仅限于开发者的 HTML/JavaScript 技能。

进一步开发

本文中的示例可以在许多方面得到改进。HTML 代码可以更新以支持更多浏览器。可以添加额外的控件选项,例如更多的鼠标事件和文本编辑功能。还可以共享(或更确切地说,自动化)单个应用程序而不是整个屏幕。对于应用程序自动化目的,本文的方法可以与代码注入技术 [2] 结合使用。图像更新方面也可以进行改进。应考虑各种仅更新屏幕图像更改部分的可能性。这可以通过将整个屏幕区域划分为多个区域,或创建已更新部分屏幕的重叠区域来实现。还可以通过将ScreenShare控制台应用程序转换为 Windows 服务来进一步改进。这看起来比实际要复杂,因为 Windows 服务运行在不同的桌面环境中,因此默认情况下捕获的是其桌面而不是主桌面的屏幕。

结论

RESTful WCF + Azure AppFabric 服务总线方法允许用户从任何地方使用任何浏览器访问和控制远程计算机。实现此目标的代码量和开发工作量非常少。代码示例说明了这种方法。

参考文献

[1] Juval Lowy. Programming WCF Services. 第三版. O'Reilly, 2010
[2] Igor Ladnik. 使用 Azure AppFabric 服务总线自动化 Windows 应用程序. CodeProject
© . All rights reserved.