简介
欢迎回到 Mobile Ink Jots。现在是七月份,发布 Windows XP Service Pack 2 (SP2) 已进入倒计时了。如果您读过我以前的专栏,或以任何方式一直跟着最新 Tablet PC 开发的脚步,毫无疑问您已经知道 Windows XP SP2 将包括 Tablet PC 的“Lonestar”版 ― 一个正式名称为 Windows XP Tablet PC 2005 版的版本。
对于 Lonestar 备有的所有新功能,最为开发人员所热切期望的是新添加的对在 Web 上手写的支持。那么,让我们开始深入研究一下它带来了什么好处,以及在各种基于 Web 的应用程序方案中运行手写应用程序实际意味着什么。
什么是 Web 应用程序?
它对支持手写的应用程序来说意味着什么?这些是有关存在的问题,但就技术而言,即便是在 2004 年,Web 仍然是一个非常混乱的概念区域。谈到这类内容时,我们必须非常谨慎而且非常明确。对不同的人来说,“Web 应用程序”这一短语意味着截然不同的东西。
对于初学者来说,我们不是在讨论 ASP.NET 对比 PHP 对比 JavaServer Pages (JSP) 或您有的东西。这是因为根本没有这个必要 ― 所有这些服务器端 Web 技术都能用于为 Tablet PC 客户端提供丰富的、支持手写的内容(稍后会介绍更多有关此方面的内容)。更确切地说,我们需要关心的 Web 技术几乎全部是客户端层:如何提供优于 Web 浏览器内置功能的丰富用户体验,从而允许手写的收集和呈现。例如,如何加载(和编写)一个嵌入在 Web 页中的启用手写的控件?
当然,目前 Web 不再与浏览器密切结合。成熟的富客户端应用程序与 Web 服务通讯,而其中从没有显示任何 HTML,这种情况也并非罕见。但是,这类启用 Web 的客户端应用程序对“Web 应用程序”来说并不是一个非常有用的定义。很多 Tablet PC 应用程序都是按这种方式设计的。为了本次讨论,我会将 Web 应用程序定义为任何程序或组件代码 ― 其自身通过 HTTP 部署,从而使对访问 Web 服务器的客户端变得无缝可用,而无须安装、配置或维护任何东西。
在过去十年的大部分时间中,Java 小程序和 Microsoft ActiveX_ 组件构成了富客户端层 Web 应用程序技术的基础。但是对于 .NET Framework 来说,ActiveX 控件是一项被极力反对的技术(而且在 Tablet PC 的开发期间,使用 Java 是无法成功的)。没关系。.NET Framework 给双方提供了一个更好的选择:我们可以使用 C# 或 Microsoft Visual Basic_ .NET 以及 .NET Framework 的 Windows Forms 类在我们的 Web 应用程序中实现富客户端层功能。这是真的,无论我们需要在 Internet Explorer Web 页中添加一个自定义控件,还是开发一个带有其自己的框架窗口的独立可执行文件(或者可能是二者的某种结合)都是如此。相同的 .NET Framework 技术 ― Windows Forms、代码访问安全性,以及现在的 Microsoft.Ink,应用于所有这两个解决方案。
从 1.0 版本开始,.NET Framework 已经支持通过 HTTP 进行代码的部署和分发。Windows Forms 可执行文件可以很简单地部署在 Web 服务器上,并在 URL 上运行 ― 一种称为无接触部署的方法 ― Internet Explorer 5.01 版引入了 object 标记的一种新语法,它允许加载托管 Windows Forms 控件而不是 ActiveX 控件。不过,支持在这些“移动代码”方案中运行手写对 Tablet PC 的 Lonestar 版来说是个新功能。
在上述任一情况下,只要 .NET Framework 运行库执行移动代码(任何从远程源― 通常是 Web 服务器,但也可能是 FTP 站点或映射网络驱动器 ― 获得的代码),该代码就会受名为沙箱(听起来有点古怪)的东西的约束。Java 是沙箱安全模型的先驱,使得全世界的用户可以安全地在任意 Web 站点上与 Java 小程序进行交互,而无须过多地担心这些小程序会将硬盘重新格式化,或窃取我们的个人信息,或有其他不轨行为。
通过自动映射一组基于证据 的权限,.NET Framework 在 Java 沙箱安全模式上进行了改进,该证据有效地具有关于代码来自何处和/或由谁编写的可信信息。这意味着,在默认情况下,与从本地 Intranet 下载的控件和程序相比,从 Internet 下载的程序和控件普遍以一个更受限制的权限集(将其看作一个更小的沙箱)运行。从一个逻辑极端来讲,从计算机的本地硬盘运行的代码得到整个权限集(或者根本没有沙箱,或者有一个无穷大的沙箱,这取决于您的观点)。从另一个逻辑极端来讲,从一个在 Internet Explorer 的受限站点区域中列出的站点运行的代码根本得不到任何权限去运行。
随着讨论的进行,我们将对代码访问安全做更详细的探讨。首先,让我们开始学习如何在 Internet Explorer(毫无疑问它还宿主大多数瘦客户端 Web 应用程序)中宿主启用手写的自定义控件。
在 Internet Explorer 中宿主启用手写的控件
在 MSDN Magazine 的 2002 年一月刊中,Jay Allen 的文章 Host Secure, Lightweight Client-Side Controls in Microsoft Internet Explorer 提供了一个关于在 Internet Explorer 中宿主托管 Windows Forms 控件的非常好的背景。本文中的示例使用了一个 ActiveX-era