作者: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/申請一個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; }
設定 { _title = value; }
}
private string _url;
public string Url
{
get { return _url; }
設定 { _url = value; }
}
private string _snippet;
public string Snippet
{
get { return _snippet; }
set { _snippet = 值; }
}
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)
{
GoogleSearchService s = new GoogleSearchService();
GoogleSearchResult result = s.doGoogleSearch(
lisenceKey,
query,
0,
10,
false,
"",
false,
"",
"",
""
);
List
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,後面的步驟會用到:
下面來看Bridge檔GoogleSearchBridge.asbx的聲明:
注意到
licenseKey的value屬性值設定為% appsettings : GoogleWebAPILisenceKey %,這是asbx檔案中引入的一個新寫法,代表在運行時它的值將被指派為web.config檔案中appSettings段中key為GoogleWebAPILisenceKey的值。
query將由客戶端傳過來,代表查詢的關鍵字。
到此為止,我們可以在Atlas頁面中測試一下了,當然第一步還是在頁面上添加ScriptManager,還有對上面Bridge的引用:
在新增一段HTML,用來讓使用者輸入查詢關鍵字,引發查詢並顯示結果:
最後,寫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("
範例程式可以在此下載: