Autor: Dflying Chen ( http://dflying.cnblogs.com/ )
Im vorherigen Beitrag (Aufrufen eines Webdienstes im ASP.NET-Atlas – Erstellen eines Mashups zum Aufrufen eines Remote-Webdienstes (Yahoo! Weather-Instanz)) habe ich die Verwendung von BridgeRestProxy zum Ausführen eines Mashups für einen Webdienst vorgestellt. In der tatsächlichen Entwicklung reicht diese einfache Methode jedoch häufig nicht aus. Wir müssen Programmcode schreiben, um eine komplexe Logik zu vervollständigen. Das heißt, verwenden Sie eine benutzerdefinierte komplexe Proxy-Klasse anstelle der in Atlas integrierten Klassen sowie einige XML-Tags in der asbx-Datei. Heute nehmen wir ein komplexeres Beispiel: Mashup Googles Suchdienst, um zu lernen, wie man eine benutzerdefinierte Klasse verwendet, um Aufrufe an Remote-Webdienste weiterzuleiten.
Werfen wir zunächst einen Blick auf die von Google bereitgestellten Dienste: Google stellt uns Entwicklern eine Reihe von APIs zur Verfügung, die Sie unter http://api.google.com/ einsehen können. Für die Such-API, die wir heute verwenden werden, Sie können auch unter http://api.google.com/Apply einen Google-Lizenzschlüssel anfordern und diesen Schlüssel bei jeder Anfrage an Google angeben. Ich habe mir die Dokumentation von Google angesehen und festgestellt, dass jeder Lizenzschlüssel nur 1.000 Anfragen pro Tag zulässt. Wenn Sie die Google-Suche auf einer großen Website verwenden müssen, müssen Sie leider eine Reihe von Lizenzschlüsseln vorbereiten. . Google ist wirklich genug Geizig-_-b.
Nachdem Sie den Lizenzschlüssel beantragt haben, können wir loslegen. Wenn Sie zum ersten Mal mit Mashup in Kontakt kommen, sollten Sie sich vielleicht diesen Artikel von mir ansehen: Webdienst im ASP.NET-Atlas aufrufen – Erstellen eines Mashups zum Aufrufen des Remote Web Service (Grundlagen und einfache Beispiele).
Verwenden Sie zunächst das mit Visual Studio gelieferte Tool „wsdl.exe“, um den C#-Code zu generieren, der den Google Web Service basierend auf seiner WSDL-Adresse aufruft:
wsdl.exe http://api.google.com/GoogleSearch.wsdl
generiert GoogleSearchService.cs Fügen Sie es dem App_Code-Verzeichnis unserer Website hinzu. An diesem Punkt können wir die Klassen in dieser Datei tatsächlich direkt verwenden, darunter GoogleSearchService.doGoogleSearch() die Methode, die wir benötigen. Aber werfen Sie einen Blick auf diese automatisch generierte chaotische Klasse. Sie enthält viele andere Methoden, und die Methode doGoogleSearch() erfordert auch viele Parameter. Daher sollten wir diese chaotische Datei zuerst umschließen, ihre Aufrufe kapseln und vereinfachen.
In diesem Beispielprogramm müssen wir für jedes Suchergebnis nur die Felder „Titel“, „URL“ und „Snippet“ abrufen. Um den Netzwerkverkehr zu reduzieren, verwenden wir nicht die Suchergebnisklasse, die mit GoogleSearchService.cs geliefert wird, sondern passen eine SearchResultLite-Klasse an, die nur den von uns benötigten Inhalt enthält:
die öffentliche Klasse SearchResultLite
{
private Zeichenfolge _title;
öffentlicher String-Titel
{
get { return _title }
set { _title = value }
}
private Zeichenfolge _url;
öffentliche String-URL
{
get { return _url }
set { _url = value }
}
privater String _snippet;
öffentliches String-Snippet
{
get { return _snippet }
set { _snippet = value }
}
public SearchResultLite()
{
}
public SearchResultLite(String-Titel, String-URL, String-Snippet)
{
_title = Titel;
_url = URL;
_snippet = Ausschnitt;
}
}
Beachten Sie, dass die obige SearchResultLite-Klasse über einen standardmäßigen Konstruktor ohne Parameter verfügen muss und jedes Feld Attribute anstelle von öffentlichen Mitgliedern verwenden muss, da Atlas sonst beim Konvertierungsprozess in JavaScript-Objekte Fehler macht.
Lassen Sie uns GoogleSearchService.doGoogleSearch() umschließen:
öffentliche Klasse GoogleSearchWarpper
{
public SearchResultLite[] Search(string lisenceKey, string query)
{
GoogleSearchService s = new GoogleSearchService();
GoogleSearchResult result = s.doGoogleSearch(
Lizenzschlüssel,
Abfrage,
0,
10,
FALSCH,
"",
FALSCH,
"",
"",
„“
);
List<SearchResultLite> resultLites = new List<SearchResultLite>();
foreach (ResultElement-Element in result.resultElements)
{
SearchResultLite resultLite = new SearchResultLite(elem.title, elem.URL, elem.snippet);
resultLites.Add(resultLite);
}
return resultLites.ToArray();
}
}
Auf diese Weise benötigen wir beim Aufruf der Suchmethode nur zwei Parameter und die zurückgegebenen Daten enthalten keinen redundanten Teil. Speichern Sie es als GoogleSearchWarpper.cs.
Als nächstes müssen wir den zu Beginn beantragten Lizenzschlüssel zur web.config-Datei hinzufügen, die in den folgenden Schritten verwendet wird:
<appSettings>
<add key="GoogleWebAPILisenceKey" value="!!Geben Sie hier Ihren Lizenzschlüssel ein!!"/>
</appSettings>
Schauen wir uns die Deklaration der Bridge-Datei GoogleSearchBridge.asbx an:
<?xml version="1.0" binding="utf-8" ?>
<bridge namespace="Dflying" className="GoogleSearch" >
<proxy type="GoogleSearchWarpper, App_Code" />
<Methodenname="Suchen">
<Eingabe>
<parameter name="lisenceKey" value="% appsettings : GoogleWebAPILisenceKey %" serverOnly="true" />
<parameter name="query" />
</input>
</Methode>
</bridge>
Beachten Sie, dass der Typattributwert des Abschnitts <proxy> als GoogleSearchWarpper-Klasse in App_Code angegeben ist, d. h. unter Verwendung des soeben definierten Proxy-Objekts. Für die beiden Parameter der Suche:
Der Wert des Attributs „licenseKey“ wird auf % appsettings gesetzt: GoogleWebAPILisenceKey % Dies ist eine neue Schreibmethode, die in der asbx-Datei eingeführt wird, was bedeutet, dass ihr Wert dem Abschnitt „appSettings“ im Web zugewiesen wird. Der Schlüssel der Konfigurationsdatei zur Laufzeit ist der Wert von GoogleWebAPILisenceKey.
Die Abfrage wird vom Client übergeben und stellt das Schlüsselwort der Abfrage dar.
An dieser Stelle können wir es auf der Atlas-Seite testen. Der erste Schritt besteht natürlich darin, ScriptManager zur Seite und einen Verweis auf die obige Bridge hinzuzufügen:
<atlas:ScriptManager ID="scriptManager" runat="server">
<Dienste>
<atlas:ServiceReference Path="GoogleSearchBridge.asbx" />
</Dienste>
</atlas:ScriptManager>
Fügen Sie ein Stück HTML hinzu, damit Benutzer Abfrageschlüsselwörter eingeben, Abfragen auslösen und Ergebnisse anzeigen können:
<input id="tbQuery" type="text" />
<input id="btnSearch" type="button" value="Search!" onclick="return btnSearch_onclick()" />
<div id="result">
</div>
Schreiben Sie abschließend JavaScript und Sie können die Verwendung von Sys.StringBuilder sehen:
function btnSearch_onclick() {
var tbQuery = new Sys.UI.TextBox($("tbQuery"));
Dflying.GoogleSearch.Search({'query': tbQuery.get_text()}, onSearchComplete);
}
Funktion 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();
}
Das Beispielprogramm kann hier heruntergeladen werden: