程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 在ASP.NET Atlas中調用Web Service——創建Mashup調用遠端Web Service(Google Search實例)

在ASP.NET Atlas中調用Web Service——創建Mashup調用遠端Web Service(Google Search實例)

編輯:.NET實例教程


作者:Dflying Chen (http://dflying.cnblogs.com/) 
在前一篇貼子(在ASP.Net Atlas中調用Web Service——創建Mashup調用遠端Web Service(Yahoo!天氣實例))中我介紹了使用BridgeRestProxy對Web Service進行Mashup。然而,在實際開發中這種簡單的方法往往是不夠用的,我們需要書寫程序代碼來完成一些復雜邏輯。也就是使用自定義的復雜的Proxy Class,而不是Atlas內建的那幾種加上一些asbx文件中的XML標記。今天我們來接觸一個更復雜的例子:對Google的Search Service進行Mashup,以學習使用自定義的Class來代理對遠端Web Service的調用。

首先,讓我們了解一下Google提供的Service:Google提供給我們開發者一系列的API,您可以到http://api.google.com/查看,對於我們今天要使用的Search API,您還可以到http://api.google.com/googleapi.zip下載它的幫助文檔以及示例程序。在開始這個實例之前,我們必須到http://api.google.com/申請一個Google的License Key,並在每一次對Google的請求中包含這個Key。我大概看了一下Google的文檔,上面說每個License Key每天只允許1000個請求,這樣如果需要在大型的網站上使用Google的Search,恐怕要准備一堆的License Key了……Google可真夠小氣的-_-b。

License Key申請好,我們就可以開始了,當然,如果您是第一次接觸Mashup,可能還要參考一下我的這篇文章:在ASP.Net Atlas中調用Web Service——創建Mashup調用遠端Web Service(基礎知識以及簡單示例)。

首先,使用Visual Studio自帶的wsdl.exe工具,根據Google Web Service的wsdl地址生成出調用它的C#代碼:

wsdl.exe http://api.google.com/GoogleSearch.wsdl

將生成的GoogleSearchService.cs加到我們的Web Site的App_Code目錄中。到這時,我們其實就可以直接使用這個文件中的類了,其中GoogleSearchService.doGoogleSearch()就是我們需要的方法。不過觀察一下這個自動生成的亂糟糟的類,其中有好多別的方法,doGoogleSearch()方法也需要好多參數,所以還是先對這個亂糟糟的文件來個包裝,封裝並簡化一下對它的調用。

在這個示例程序中,對於每條搜索結果,我們只要得到它的Title,URL以及Snippet三個字段。為了減少網絡流量,我們不使用GoogleSearchService.cs中自帶的搜索結果的類,而是自定義一個只包含我們需要內容的SearchResultLite Class:

public class SearchResultLite
{
    private string _title;
    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }

    private string _url;
    public string Url
    {
        get { return _url; }
        set { _url = value; }
    }

    private string _snippet;
    public string Snippet
    {
        get { return _snippet; }
        set { _snippet = value; }
    }

    public SearchResultLite()
    {
    }

    public SearchResultLite(string title, string url, string snippet)
    {
        _title = title;
        _url = url;
        _snippet = snippet;
    }
}

注意上面的SearchResultLite Class中一定要有一個默認的無參的構造函數,並且每一個字段都要使用屬性而不是public的成員,否則Atlas在做與JavaScript對象的轉換過程中會出錯。

下面來對GoogleSearchService.doGoogleSearch()進行包裝:

public class GoogleSearchWarpper
{
    public SearchResultLite[] Search(string lisenceKey, string query)
    {
  &nbs
p;     GoogleSearchService s = new GoogleSearchService();
        GoogleSearchResult result = s.doGoogleSearch(
            lisenceKey,
            query,
            0,
            10,
            false,
            "",
            false,
            "",
            "",
            ""
        );
        List<SearchResultLite> resultLites = new List<SearchResultLite>();
        foreach (ResultElement elem in result.resultElements)
        {
            SearchResultLite resultLite = new SearchResultLite(elem.title, elem.URL, elem.snippet);
            resultLites.Add(resultLite);
        }
        return resultLites.ToArray();
    }
}

這樣我們在調用Search方法的時候只需要兩個參數即可,並且返回的數據也沒有冗余的部分。將其存為GoogleSearchWarpper.cs。

接下來我們要在web.config文件中添加開頭申請到的License Key,在後面的步驟中會用到:

<aPPSettings>
    <add key="GoogleWebAPILisenceKey" value="!!input your license key here!!"/>
</aPPSettings>

下面來看Bridge文件GoogleSearchBridge.asbx的聲明:

<?XML version="1.0" encoding="utf-8" ?>
<bridge namespace="Dflying" className="GoogleSearch" >
  <proxy type="GoogleSearchWarpper, App_Code"  />
  <method name="Search">
    <input>
      <parameter name="lisenceKey" value="% aPPSettings : GoogleWebAPILisenceKey %" serverOnly="true" />
      <parameter name="query" />
    </input>
  </method>
</bridge>

注意到<proxy>段的type屬性值被指定為在App_Code中的GoogleSearchWarpper類,也就是使用我們剛剛定義的Proxy對象。對於Search的兩個參數:

licenseKey的value屬性值設置為% appsettings : GoogleWebAPILisenceKey %,這是asbx文件中引入的一個新寫法,代表在運行時它的值將被指派為web.config文件中aPPSettings段中key為GoogleWebAPILisenceKey的值。 
query將由客戶端傳過來,代表查詢的關鍵字。 
到此為止,我們可以在Atlas頁面中測試一下了,當然第一步還是在頁面上添加ScriptManager,還有對上面Bridge的引用:

<atlas:ScriptManager ID="scriptManager" runat="server">
  &n
bsp; <Services>
        <atlas:ServiceReference Path="GoogleSearchBridge.asbx" />
    </Services>
</atlas:ScriptManager>

在添加一段Html,用來讓用戶輸入查詢關鍵字,引發查詢並顯示結果:

<input id="tbQuery" type="text" />
<input id="btnSearch" type="button" value="Search!" onclick="return btnSearch_onclick()" />
<div id="result">
</div>

最後,編寫JavaScript,可以看到其中對Sys.StringBuilder的使用:

function btnSearch_onclick() {
    var tbQuery = new Sys.UI.TextBox($("tbQuery"));
    Dflying.GoogleSearch.Search({'query': tbQuery.get_text()}, onSearchComplete);
}

function onSearchComplete(result) {
    var sbResult = new Sys.StringBuilder();
    for (var i = 0; i < result.length; ++i) {
        sbResult.append("<hr />");
        sbResult.append("<b>" + result[i].Title + "</b><br />");
        sbResult.append("<a href=\"" + result[i].Url + "\" target=\"_blank\" >" + result[i].Url + "</a><br />");
        sbResult.append(result[i].Snippet);
    }
    $('result').innerHtml = sbResult.toString();
}

示例程序可以在此下載:http://www.cnblogs.com/Files/dflying/GoogleSearchBridge.zip

注意:想運行這個示例程序,您需要在web.config中的GoogleWebAPILisenceKey部分填入您申請好的License Key。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved