我们组对即将推出的 .NET 技术进行了研究,并认识到可以通过将代码移植到 .NET 框架来解决所有远程性问题。而且,还有一个意外收获,我们还可以实现 HTTP 和 SOAP 的无处不在的连接。对绝大多数人而言,是否有某个人在 Microsoft 或在世界的某个地方,使用我们的 Web 服务在内部开发用于完全不同用途的应用程序,无关紧要。我们对两种情况均予以支持,同时我们也可以免费获得技术方面的好处。
最新的 Search 2.5 版如今运行在 Site Server 3.0 上,并仍然使用 COM 从搜索目录获得结果。该应用程序的其它各个方面都基于 XML。XML 作为一种将数据(例如,Vocabulary 和 Best Bets)发布到 Web 服务器的手段,使我们能够轻而易举地扩大我们的 Web 空间。
我们同时执行了一项缓存客户请求的最为常用的查询和结果的方案,这是通过将这些查询和结果保留在 Web 服务器上来实现的,并因此增强了可扩展性,进一步提高了性能。由于我们的核心体系结构是基于 XML 的,因而,移植到一个将利用 .NET 框架 Web 服务的模型确实非常简单,而这些 .NET 框架 Web 服务是建立在新型 ASP+ 技术基础之上的(ASP+ 技术被称为活动服务器方法 (ASMX) 页面)。作者: abcdef133 时间: 2007-9-16 12:52
转换
Search 体系结构由三个组件组成:
Word Parsing and Vocabulary
Best Bets
Search Results
Search 的 .NET 端口的体系结构与基于 ASP 的版本相同(参见图 1)。下面让我们深入了解一下各个组件。
(图1)
图 1.用户提交查询后,(1) 将查询先提交给解析器 (Parser) 进行词条分割和词汇解析,(2) 将找到的项目的显示术语 (Display Term) 传给 Best Bets,(3) 将找到的项目的首选术语 (Preferred Term) 和剩余项目传给 Search Results,(4) 使用 XSL 样式表编译生成的 XML 文档,(5) 给用户的 Web 浏览器提交 HTML。单击以放大。
Word Parsing and Vocabulary _ 这是一个包含一个 C++ COM 对象的 Windows 脚本组件,它暴露出 Search 中所支持的所有语言的各种词条分割程序。这种设计之所以必要是因为词条分割程序的接口不容易编写成脚本,并且通常需要一种 C++ 可编脚本的封装(尽管这是有办法做到的:以后将对此进行详细解释)。在向 .NET 框架移植的过程中,我们使用了 C++ 对象上的类型列表导出程序 (TLBIMP.EXE),并通过 .NET 中的 Interop 技术对其进行调用,这样您就可以调用现有的 COM 对象了。
Vocabulary Object 运行 Xpath(查询 XML 文档的语言)查询,以便将搜索词条映射到首选术语。它同时去除了干扰词条,并产生一种格式化的数据结构,适合于 Best Bets 和 Search Results 组件进行消耗。一项重要成果是,这个相当复杂的小脚本得以移植到 C#,我们还可以继续从中调用传统对象。下面是 Vocabulary Object 中的一个小代码示例:
以下为引用的内容:
// We return an array of VocabularyObjects after parsing the user′s search // text. This ability to create simple typed structures in C# vastly improves // our code modularity and self-documentation. Here is the definition of // VocabularyObject: public struct VocabularyObject { public string PREFERREDTERM; // structure members public string DISPLAYTERM; public bool FOUND; public string ORIGPHRASE; public bool MULTITERM; public bool MULTIWORD; // Constructor public VocabularyObject(string preferredterm,bool found,string origphrase, bool multiterm,bool multiword,string displayterm) { PREFERREDTERM = preferredterm; FOUND = found; ORIGPHRASE = origphrase; MULTITERM = multiterm; MULTIWORD = multiword; DISPLAYTERM=displayterm; } } // Example usage. Because the parameters to the objects constructor are // typed, we′ll get a compiler error message if we passed an integer // where a string was expected, for example. This is a very nice feature // over traditional scripting environments! VocabularyObject vo("Microsoft DirectX",true,"dx",false,false,"DirectX");
首先,我们将主要的 ASP 页面转换为 ASP+。最初,我们是通过 .NET Reflection 技术调用小脚本,这样我们可以在运行时通过查询类型库来调用典型的 COM 对象。
重要知识:我们从具有 ASP 的编程模型出发(其中,数据、业务逻辑以及表示全都被混合在一起),然后采用 ASP+ 的一种完全面向对象的方法,最后是数据分离、编程以及 UI。
其次,处理最简单的小脚本并将其移植。BestBets 是最简单的组件,并且不依赖于 COM 组件。我们决定使用 System.IO、XML Data Navigator 以及 C# 编程语言将这个组件作为 DLL 移植。我们希望将这个组件完全移植到受控环境,并使其充分利用 XML Data Navigator。
重要知识:我们了解了 NewXml 命名空间。同时,我们在移植组件时去除了 .NET Reflection。这样我们就可以在本地调用这些组件。
然后,我们以同样方式处理 Vocabulary 小脚本。这个组件在复杂性和代码行方面处于此应用程序的中间。它由一个小脚本组成,这个小脚本包含用于 Search 的业务和文本解析规则,并对 C++ 组件进行调用,我们创建该组件的目的是包装 COM 对断字程序的引导调用。这个组件在移向受控空间方面具有最大优点。这个复杂组件被全部移植到 .NET 框架和 C# 编程语言。这需要一些技巧,因为,它包含更为复杂的函数逻辑,并需要利用一个自定义 COM 对象。但这还不算太难。下一步将抛弃 C++ 包装并直接调用这些接口。