新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → 用Office2k3和GoogleWeb服务API建立自己的搜索库 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2997 个阅读者  浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 用Office2k3和GoogleWeb服务API建立自己的搜索库 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18407
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 Dot NET,C#,ASP,VB 』的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客楼主
    发贴心情 用Office2k3和GoogleWeb服务API建立自己的搜索库


    发信人: Nineteen (-_-#!), 信区: DotNET
    标  题: 用Office2k3和GoogleWeb服务API建立自己的搜索库
    发信站: BBS 水木清华站 (Sun Feb  8 08:25:23 2004), 转信

    http://www.microsoft.com/china/msdn/library/dnofftalk/html/office03062003.asp
    使用 Office 2003 和 Google Web 服务 API 建立自己的搜索库  
    Chris Kunicki
    OfficeZealot.com  
    2003年3月3日  
    摘要:Chris Kunicki 介绍了如何生成搜索库,它是 Microsoft Office 2003 的一个很棒的新功能,使用它可以轻松地在 Office 内部搜索外部资源。  

    下载 GoogleResearchLibrarySource.exe。(请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解。)

    注意:本文中的信息基于 Office 2003 Beta 2。与往常一样,此信息可能会发生更改。我已经尽一切努力将重点放在产品发布时实现的功能。
    在上期专栏中,我谈到了 What's New with Smart Tags in Office 2003(英文)这一主题。令我高兴的是,Microsoft Office 的下一版本(正式命名为 Microsoft Office 2003)吸引了众多读者的极大关注。很多读者都热切希望使用 Beta 2。我的建议是最好访问 Office Developer Center (英文)了解如何获得 Beta 2。

    我个人使用测试版已经有很长一段时间了,我要告诉大家它的确是 Office 的一个优秀版本。真不知道从何说起。该版本中的新功能一定会使用户、企业和 ISV 为之心动。正是由于这些令人兴奋的功能,我打算在随后的几个月中集中向您介绍这些新功能,更重要的是,向您介绍 Microsoft Office 2003 实现的一些解决方案类型。  

    搜索库简介
    本月我将和大家一起探讨 Microsoft Office 2003 中隐藏的一个重要功能 - 搜索库。由于 Office 2003 中值得一提的优秀功能实在太多,因此对于搜索库无须进行过分渲染。搜索库出现在下一版本的 Microsoft Word、Microsoft Excel、Microsoft PowerPoint?、Microsoft Outlook?、Microsoft Publisher、Microsoft OneNote(tm) 和 Internet Explorer 中。在以上每种应用程序中,搜索库都以任务窗格的形式出现。  

    什么是搜索库?顾名思义,它是一种内置的搜索工具,允许用户在 Office 内部搜索各种信息源。其中的某些搜索源内置于 Office 中,而其他搜索源则是外部服务,因此需要连接到 Internet 才能使用。图 1 显示了运行中的内置英语同义词搜索服务。



    图 1:Microsoft Word 2003 中的 Research 任务窗格

    仔细查看图 1 中显示的 Research 任务窗格,我们将看到以下元素:  

    对于大多数受支持的应用程序,可以通过单击 Standard 工具栏上的 Research 按钮来访问搜索库。另外,也可以通过打开任务窗格 (View | Task Pane) 并从可用任务窗格列表中选择 Research 来访问 Research 任务窗格。  
    打开 Research 任务窗格后,请在 Search for 文本框下键入搜索文本。也可以按下 ALT 键并单击文档中的文本。通过按下 ALT 键并单击文本,Office 应用程序将打开任务窗格并将此文本置于 Search for 文本框中。  
    然后,从服务列表中选择搜索服务。在本文的后面部分,我将列举其中的某些服务。最后,请单击带有箭头的绿色 Go 按钮,开始搜索。  
    Research 任务窗格提供与 Web 浏览器类似的 Back 和 Forward 按钮,用来查看前面进行的搜索。  
    Research 任务窗格将显示搜索的结果。可在单个搜索中使用多个服务,搜索结果将由搜索服务的标题分隔。  
    Research 任务窗格支持许多控件类型。图 1 显示一个下拉菜单,使用它可以将选定文本插入或复制到当前文档中。  
    在 Research 任务窗格的底部,您将看到 Research options... 链接。单击此链接将打开 Research Options 对话框,如图 2 所示。  


    图 2:用于配置 Office 使用的搜索服务的 Research Options 对话框。

    Research Options 对话框用于添加新的搜索服务、更新现有服务、修改父控件和查看已安装服务的属性。正如图 2 所示,Office 2003 Beta 2 附带了一些搜索服务。下表归纳了其中的某些服务:  

    计算机上的本地源  
    同义词和翻译  
    Office 2003 搜索服务  
    词典  
    百科全书  
    Web 搜索  
    股票行情  
    第三方搜索服务  
    Factiva  
    eLibrary  
    Gale  
    WorldLingo  
    其他更多服务  
    其中的多数服务都需要与 Internet 建立有效连接。如果用户未连接到 Internet,则将无法使用某些搜索服务。需要有效连接的搜索服务提供了 Web 中许多有用资源的最新准确信息。我个人最喜欢使用的一项服务是 MSN Money Stock Quotes 搜索服务。图 3 显示了在股票行情自动收录器上搜索 MSFT 的结果。



    图 3:使用 MSN Money Stock Quotes 搜索服务的示例

    比较图 1 和图 3 两种不同搜索服务的结果时,您会体会到显示不同数据类型时的灵活性。MSN Money Stock Quotes 中显示了一个格式化的表格,一个用来转到 MSN Web 站点获取表格的超链接,以及一个标有 Insert Stock Price 的按钮。Insert Stock Price 按钮实际上是一个智能标记。Research 任务窗格可以随意使用已安装的智能标记的操作,提高 Research 任务窗格与 Office 应用程序之间的交互性。在本例中,MSN Money Stock Quotes 可以插入最新的股票报价或插入包含当前股票统计数据的格式化表格。

    建立自己的搜索库服务
    现在,Research 任务窗格最值得一提的是具有可扩展性。Microsoft 将发布 Office Research Software Developers Kit,其中附带了 Beta 2 和最终产品版本。这样,开发人员就可以将第三方产品与内部系统信息集成在一起,另外 ISV 也可以将他们的产品系列集成到 Microsoft Office 环境中。

    在本文的余下部分,我将介绍生成搜索库服务的基本原理。该示例基于 Google Web API - 一组 XML Web Service,使软件开发人员能够直接从他们自己的应用程序中查询三十多亿个 Web 文档。在此示例中,我们将从 Research 任务窗格中查询 Google。有关使用 Google Web API 的详细信息,请访问 http://www.google.com/apis/(英文)。

    什么是 Google 搜索库服务方案?我经常启动 Internet Explorer 并转到 Google 站点,在其中搜索需要包括在我正在处理的文档或电子邮件中的信息。现在,我可以使用将要介绍的代码示例直接在 Office 中进行搜索。我可以按下 ALT 键并单击电子邮件中的文字。Research 任务窗格将打开,其中的 Search for 文本框已包含我的搜索文本。然后,我选择 Google Web 搜索服务并单击“go”。接下来,Research 任务窗格将显示搜索结果。随后,我可以单击其中的任一结果,相关的 Web 站点随即被加载到浏览器中。请查看图 4 中的 Google Web Search 搜索库的快照。



    图 4:Google Web Search 搜索库快照

    随本文一起下载的内容包含 Google Web Search 搜索库服务(已在 Office 2003 Beta 2 中进行了测试)。共有两个版本,一个版本是使用 C# 语言编写的,另一个是使用 Visual Basic? .NET 编写的。除了所使用的语法以外,二者是相同的。有趣的是,我首先用 C# 语言编写,然后将其转换为 Visual Basic .NET,为此我花费了大约 10 分钟的时间。在我看来,在不同语言之间进行转换不是很难。为了节省空间,我在本文中主要使用 C# 示例作为参考代码。

    最后,要访问 Google Web API 服务,您必须创建 Google 帐户并获取免费的许可证密钥。使用您的 Google 帐户和许可证密钥,您有权每天进行 1,000 次自动查询。您可以在 http://www.google.com/apis/(英文)申请此密钥。此过程只需要几分钟时间。然后,根据将要使用的源代码的语言版本,打开web.config 并更改 GoogleKey 自定义属性。下面显示了目录和语言版本:

    <<Unzip Directory>>\GoogleResearchLibraryCSharp  - C# 版本
    <<Unzip Directory>>\GoogleResearchLibraryVBNet - VB.NET 版本

    将 Google 分配给您的许可证密钥放到值属性中:

    <add key="GoogleKey" value="[在此处插入密钥 - 请参阅自述文件]"/>

    例如,修改后的 XML 节点应如下所示:

    <add key="GoogleKey" value="abc123ThisIsAMadeUpKeyxyz/abc"/>

    有关详细的安装步骤,请参阅附带的 README.DOC 文件。

    搜索库体系结构的基本原理
    搜索库主要由包含两种 Web 方法的 XML Web Service 组成。这与许多其他 Office 扩展模型是完全不同的。过去,扩展 Office 常常需要在客户端上安装内容。搜索库服务是标准的 XML Web Service,并且不需要客户端代码,除非您打算使用智能标记(这完全是可选的,很多搜索库不需要智能标记)。使用 Visual Studio? .NET 或其他启用了 XML Web Service 的平台,可以创建一组在服务器上运行的 Web 服务,并通过预定义的接口与 Office 进行通信。图 5(从 Office Research SDK 中获得)演示了 Office 与搜索库 XML Web Service 之间的通信流。



    图 5:Office 与搜索库 XML Web Service 之间的通信流演示  

    用户可以从 Research Options 对话框(图 2)中选择 Add Service 按钮,这将提供指向搜索库服务“Registration”页面的链接。该注册页包含一个名为 Registration() 的 Web 方法。  
    Registration() 返回以下信息:搜索服务提供商、服务类型,以及搜索过程中使用的 Query() Web 方法的服务类别和指针。现在,您就可以使用该服务了。  
    注意:您可能会认为用户要做的工作太多了,他们可能不愿意完成添加服务这样的麻烦事。为此,可以使用其他方法:(1) 您可以部署用来安装搜索库相应注册表项的安装文件;(2) Office 包含添加和更新搜索库服务的搜索机制。如果某个组织部署了 Office 2003,就可以在搜索 XML Web Service 的安装程序中包含指针。这样就可以添加新的服务,而无需在桌面上进行任何操作。
    来自搜索库的用户请求被发送到要访问的搜索库服务的 Query() Web 方法。  
    Query() 方法分析该请求并作出响应。响应返回到 Office,Office 随后显示结果。  
    Office 与搜索 XML Web Service 之间的通信必须遵循在 Office Research SDK 中定义的一组 XML 架构。例如,基于响应架构的注册响应数据包可能如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <ProviderUpdate xmlns="urn:Microsoft.Search.Registration.Response">
        <Status>SUCCESS</Status>
        <Providers>
        <Provider>
            <Message>This is a sample research library </Message>
            <Id>{9FF837AF-34D6-4a94-BB52-B0F19F3A343A}</Id>
            <Name>OfficeZealot.com</Name>
            <QueryPath>
            http://localhost/googleresearchlibrarycsharp/Query.asmx
            </QueryPath>
            <RegistrationPath>
            http://localhost/googleresearchlibrarycsharp/registration.asmx
            </RegistrationPath>
            <AboutPath/>
            <Type>SOAP</Type>
            <Services>
                <Service>
                <Id>{CD144577-9D90-4144-AE38-0D6553CA4004}</Id>
                <Name>Google Web Search (CSharp)</Name>
                <Description>Google Web Service research library</Description>
                <Copyright>All content Copyright OfficeZealot.com (c)  
                2003.</Copyright>
                <Display>On</Display>
                <Category>RESEARCH_GENERAL</Category>
                </Service>
            </Services>
        </Provider>
        </Providers>
    </ProviderUpdate>  

    在安装搜索库服务时,此信息会传递给用户。此信息中还包含 Office 了解如何与远程服务器上的搜索库服务进行通信所需的信息。

    了解 XML Web Service
    如上所述,搜索库主要由包含两种 Web 方法的 XML Web Service 组成。这两种 Web 方法可以在一个 Web 服务文件中共存。但是,我倾向于以逻辑和物理方法将它们分开,以简化代码。因此,Google Web 服务搜索服务有两个密钥文件:  

    适用于 Registration() 方法的 Registration.asmx Web 服务文件  
    适用于 Query() Web 方法的 Query.asmx Web 服务文件  
    Office 希望这些 Web 方法根据搜索库架构及其关联的命名空间做出响应。因此,每个 XML Web Service 必须使用适当的命名空间 (urn:Microsoft.Search) 来定义响应。在 C# 中,您可以在 Web 服务定义中使用以下属性:

    [WebService(Namespace="urn:Microsoft.Search")]

    对于 Visual Basic .NET:

    <WebService(Namespace:="urn:Microsoft.Search")>

    这将通知 .NET Framework 将 SOAP 邮件正文包括在 urn:Microsoft.Search 命名空间中。

    下面是 Registration.asmx.cs 中存储的 Registration() Web 方法的 C# 代码

    [WebMethod(CacheDuration=86400)] //将此缓存一整天,很少会
    更改(86400 秒 = 24 小时)
    public string Registration(string registrationxml)
    {
        string physicalPath =  
            HttpContext.Current.Server.MapPath(".").ToString();
        string httpPath =  
            ConfigurationSettings.AppSettings["ServerPath"]   
            + HttpContext.Current.Request.ApplicationPath + "/";

        XmlDocument registrationResponse = new XmlDocument();
        registrationResponse.Load(physicalPath +  
        "\\RegistrationResponse.xml");
                
        XmlNamespaceManager nsm =  
            new XmlNamespaceManager(registrationResponse.NameTable);
        nsm.AddNamespace("ns", "urn:Microsoft.Search.Registration.Response");

        registrationResponse.SelectSingleNode("//ns:QueryPath", nsm).InnerText =  
            httpPath + "Query.asmx";
        registrationResponse.SelectSingleNode("//ns:RegistrationPath",  
            nsm).InnerText =  httpPath + "Registration.asmx";
        registrationResponse.SelectSingleNode("//ns:AboutPath", nsm).InnerText =
            httpPath + "about.asmx";

        return registrationResponse.InnerXml.ToString();
    }

    此注册响应非常简单,因为它只定义了有关搜索库服务的信息。此代码加载了名为 RegistrationResponse.xml 的本地 XML 文件(功能与全局响应模板类似)并插入在运行时确定的其他信息。此代码将返回给 Office。

    下面是 Query() Web 方法及其相关的私有函数之一的代码:

    [WebMethod(CacheDuration=3600)]  //缓存 1 小时
    public string Query(string queryXml)
    {
        //验证是否已指定查询值
        if (queryXml.Length == 0)
            return "";

        string queryString;
        string applicationName;
        int startAt = 1;

        XmlDocument requestXml = new XmlDocument();
        try
        {
            requestXml.LoadXml(queryXml.ToString());

            XmlNamespaceManager nsmRequest =  
                new XmlNamespaceManager(requestXml.NameTable);
            nsmRequest.AddNamespace("ns", "urn:Microsoft.Search.Query");
            nsmRequest.AddNamespace("oc",  
               "urn:Microsoft.Search.Query.Office.Context");

            queryString = requestXml.SelectSingleNode("//ns:QueryText",  
                 nsmRequest).InnerText;
            applicationName = requestXml.SelectSingleNode("//oc:Name",  
                nsmRequest).InnerText;
            try
            {
                startAt = Convert.ToInt32(requestXml.SelectSingleNode("//ns:StartAt",  
                    nsmRequest).InnerText.ToString());
            }
            catch
            {
                startAt = 1;
            }
        }
        catch
        {
            //分析 queryXML 已失败,使用输入字符串进行 Google 搜索
            queryString = queryXml;
        }
                     
        XmlDocument responseWrapper = new XmlDocument();
        try
        {
            responseWrapper.Load(physicalPath + "\\ResponseWrapper.xml");
        }
        catch
        {
            //不能分析响应正文包装,不返回任何内容
            return "";
        }
        XmlNamespaceManager nsmResponse =  
            new XmlNamespaceManager(responseWrapper.NameTable);
        nsmResponse.AddNamespace("ns", "urn:Microsoft.Search.Response");

        responseWrapper.SelectSingleNode("//ns:Range",nsmResponse).InnerXml =  
            QueryGoogle(queryString, startAt);
        return responseWrapper.InnerXml.ToString();
    }

    private string QueryGoogle(string queryString, int startAt)
    {
        StringWriter queryResponse = new StringWriter();
        XmlTextWriter writer = new XmlTextWriter(queryResponse);

        GoogleSearchService search = new GoogleSearchService();
        try  
        {
            // 调用 search 方法
            GoogleSearchResult results =  
                search.doGoogleSearch(ConfigurationSettings.AppSettings["GoogleKey"] ,  
                queryString, startAt, PageCount, true, "", true, "", "", "");

            //上一个|下一个链接的元素
            writer.WriteElementString("StartAt",startAt.ToString());
            writer.WriteElementString("Count",PageCount.ToString());
            writer.WriteElementString("TotalAvailable",  
                results.estimatedTotalResultsCount.ToString());

            //启动 Results 元素
            writer.WriteStartElement("1/2á1?");
            //启动 Content 元素
            writer.WriteStartElement("Content",  
                "urn:Microsoft.Search.Response.Content");

            //插入 Image
            writer.WriteStartElement("Image");
            writer.WriteAttributeString("source", httpPath + "/gLogo.gif");
            writer.WriteEndElement();

            foreach(ResultElement result in results.resultElements)
            {
                writer.WriteStartElement("Heading");
                writer.WriteAttributeString("collapsible","true");
                 
                if (result.title.Length> 0)
                    writer.WriteElementString("Text",  
                        StripHtml(result.title).Trim());
                else
                    writer.WriteElementString("Text", "No Title");

                if (result.snippet.Length > 0)                writer.WriteElementString("P",                   tripHtml(result.snippet));

                if (result.summary.Length>0)
                {
                    writer.WriteStartElement("P");
                        writer.WriteStartElement("Char");
                        writer.WriteAttributeString("light", "true");
                        writer.WriteString("Description: ");
                        writer.WriteEndElement();
                        writer.WriteString(StripHtml(result.summary));
                    writer.WriteEndElement();
                }

                writer.WriteStartElement("Hyperlink");
                writer.WriteAttributeString("url", result.URL);
                writer.WriteElementString("Text", result.URL);
                writer.WriteEndElement();

                writer.WriteEndElement(); //标题
            }

            writer.WriteElementString("HorizontalRule","");
            writer.WriteStartElement("Hyperlink");
                writer.WriteAttributeString("url",  
                    "http://www.google.com/search?q="+ queryString);
                writer.WriteElementString("Text",  
                    "Continue your search at Google.com ...");
            writer.WriteEndElement();
            writer.WriteStartElement("Hyperlink");
                writer.WriteAttributeString("url",  
                    "http://groups.google.com/groups?q="+ queryString);
                writer.WriteElementString("Text",  
                    "Search at groups.Google.com ...");
            writer.WriteEndElement();
            //搜索结果概述
            writer.WriteElementString("P", "Search took " +  
                Math.Round(results.searchTime,2).ToString() + " seconds.");
            writer.WriteElementString("HorizontalRule","");
            writer.WriteStartElement("Image"); //插入 OZ 徽标图像
            writer.WriteAttributeString("source", httpPath + "/oz15owide.gif");
            writer.WriteEndElement();

            writer.WriteEndElement(); //关闭 Content 元素
            writer.WriteEndElement(); //结果 Content 元素

            writer.Close();

            return queryResponse.ToString();
        }
        catch (System.Web.Services.Protocols.SoapException ex)  
        {
            return "";
        }
    }

    当用户通过 Research 任务窗格请求信息时,请求将根据查询请求的架构进行包装。然后,该信息将传递给 Query() Web 方法并可用于在 queryXml 参数中进行分析。Query() 从 queryXml 中提取搜索项,然后将该搜索项转发给 QueryGoogle() 函数。  

    QueryGoogle() 实际上为实现此解决方案执行所有繁重的操作。它通过将搜索项用作输入参数来调用 Google Web 服务 API。来自 Google 的响应被分析并根据搜索库响应架构重新包装。以下 XML 包是图 4 所示的一个响应示例:

    <?xml version="1.0" encoding="utf-8"?>
    <ResponsePacket revision="1" xmlns="urn:Microsoft.Search.Response">
    <Response domain="{CD144577-9D90-4144-AE38-0D6553CA4004}">
        <Range>
            <StartAt>1</StartAt>
            <Count>2</Count>
            <TotalAvailable>738</TotalAvailable>
            <Results>
            <Content xmlns="urn:Microsoft.Search.Response.Content">
                <Image source="">http://localhost/GoogleResearchLibraryCSharp//gLogo.gif"/>
                <Heading collapsible="true">
                <Text>Smart Solutions Opinion</Text>
                <P>Office as Swiss Army Knife. Chris Kunicki.. </P>
                <Hyperlink url="">http://www.msofficemag.net/opinion/default.asp?sort=W&Ord=A">
                    <Text>">http://www.msofficemag.net/opinion/default.asp?sort=W&Ord=A
                </Hyperlink>
                </Heading>
                <Heading collapsible="true">
                <Text>What's New with Smart Tags in Office 11</Text>
                <P>Rate this page: 4 users, 3.8 out of 5. Read User ... </P>
                <Hyperlink url="">http://msdn.microsoft.com/columns/office.asp">
                    <Text>">http://msdn.microsoft.com/columns/office.asp
                </Hyperlink>
                </Heading>
                <HorizontalRule/>
                <Hyperlink url="http://www.google.com/search?q=ChrisKunicki">
                <Text>Continue your search at Google.com ...</Text>
                </Hyperlink>
                <Hyperlink url="http://groups.google.com/groups?q=ChrisKunicki">
                <Text>Search at groups.Google.com ...</Text>
                </Hyperlink>
                <P>Search took 0.19 seconds.</P>
                <HorizontalRule/>
                <Image source="">http://localhost/GoogleResearchLibraryCSharp//oz15owide.gif"/>
            </Content>
            </Results>
        </Range>
        <Status>SUCCESS</Status>
        </Response>
    </ResponsePacket>

    Query.asmx 频繁使用 XMLTextWriter 对象。此对象为格式正确的 XML 文档提供了高效、简便的方法。由于来自 Query 接口的响应基于架构结构的 XML,因此具有格式正确的 XML 文档十分重要,否则 Research 任务窗格很可能显示一个空窗格。以下示例演示了 XMLTextWriter 对象的用法:

    writer.WriteStartElement("P");
    writer.WriteStartElement("Char");
    writer.WriteAttributeString("light", "true");
    writer.WriteString("Description: ");
    writer.WriteEndElement();
    writer.WriteString(StripHtml(result.summary));
    writer.WriteEndElement();

    创建以下 XML:

    <P><Char light="True">Description: information from google</Char></P>

    乍一看,创建一个简单的 XML 字符串好象要使用很多代码。然而,典型的响应包可包含 50 到 100 行的 XML 代码。使用一般的字符串处理例程管理这些代码将相当繁琐。XMLTextWriter 对象不仅提供了一种构造此 XML 响应包的有效方法,而且它还很容易通过代码进行创建和管理。

    特别说明
    正如您想象的那样,我们只是接触了这种技术的皮毛而已。作为最早采用这项新技术的用户,我想在最后的几个段落中向大家谈一谈生成搜索窗格的体会。  

    生成搜索任务窗格的经历类似于学习 HTML,因为搜索库是通过用 Microsoft 定义的 XML 结构格式化的 Web 服务实现的响应。我花了两天的时间研究它们的搜索库架构,然后才能得心应手地使用语法。尽管 Research Library 任务窗格类似于嵌入的浏览器,但是它并不象浏览器那样灵活。您不能设置背景颜色,对文本和图像布局的控制能力有限,而且没有客户端脚本。尽管如此,但如果您了解语法所允许的操作,您会发现其实可以执行很多操作。

    另一个有趣的问题是您必须学会使用有限的屏幕区域。您要使用的区域的宽度通常为 100 - 200 像素。因此,必须学会如何节约使用空间来显示信息。在某些情况下,您可以将它与 PDA 的格式信息进行比较,因为它们是类似的窗体要素。  

    使用 XML Web Service 的 .NET Framework 的优点之一是,它是一种优秀的内置缓存技术。通过将以下属性添加到 Response() Web 方法,我们将获得很少变化的注册响应缓存:

    [WebMethod(CacheDuration=86400)] //将此缓存一整天,很少会
    更改(86400 秒 = 24 小时)
    public string Registration(string registrationxml)

    此外,我还将此属性应用于 Query() 方法并将缓存时间设置为 1 小时,如以下代码所示:

    [WebMethod(CacheDuration=3600)]  //缓存 1 小时
    public string Query(string queryXml)

    此外,如何调试搜索库呢?当然,可以将调试搜索库与调试 HTML 浏览器应用程序进行比较;但是,在这种情况下,Office 客户端就是浏览器。在要调试的 Web 方法中设置断点,然后运行打开调试的项目。Visual Studio .NET 将启动 Internet Explorer 实例并将代码置于调试模式中。使 Internet Explorer 窗口保持打开状态,然后切换到您正在测试的 Office 应用程序。在您开始通过搜索库运行搜索请求时,Visual Studio .NET 将在断点处暂停。

    最后,还有几个小问题需要注意:  

    搜索库支持通过窗体语法收集大量信息。  
    支持通过 https:// 进行安全连接。  
    搜索库支持 Windows 验证。  
    Cookie 支持:  
    可以写入可由浏览器识别的 Cookie。  
    与 Internet Explorer 共享永久的 Cookie。  

    --------------------------------------------------------------------------------

    Chris Kunicki 与客户、架构师和工程师协作在 OfficeZealot.com 上创建了很棒的桌面、企业和 Web 应用程序。Chris 一直从事 Office 的开发,坚持以书面和口头的形式向用户和开发人员宣传 Office 是建立解决方案的一个重要平台。您可以通过 chris@officezealot.com与他联系,或者登录 http://www.officezealot.com(英文)了解他的观点。


    --
    ——长夜漫漫,无心睡眠……难道狼妹妹也睡不着吗?


    ※ 修改:·Nineteen 于 Feb  8 08:25:58 修改本文·[FROM:     202.206.3.*]
    ※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.206.3.*]
    上一篇
    返回上一页
    回到目录
    回到页首


       收藏   分享  
    顶(0)
      





    关闭广告显示

    ----------------------------------------------

    -----------------------------------------------

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/9 2:26:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 点击这里发送电邮给Google AdSense  访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/6/20 11:17:03

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    558.594ms