Autor: Dflying Chen ( http://dflying.cnblogs.com/ )
Im vorherigen Artikel (Aufrufen von Webdiensten in ASP.NET Atlas – Erstellen eines Mashups zum Aufrufen von Remote-Webdiensten (Grundkenntnisse und einfaches Beispiel)) habe ich einige Grundkenntnisse über Mashup für Remote-Webdienste in Atlas vorgestellt und ein einfachstes Beispiel gegeben das ist überhaupt nicht sinnvoll. Um heute auf dieses Thema zurückzukommen, werde ich ein komplexeres, aber einigermaßen nützliches Beispiel geben – Yahoo!
Genug Unsinn, machen wir uns zunächst mit dem Yahoo!-Wetterdienst vertraut: Yahoo bietet auf seiner Website einen Wettervorhersagedienst an ( http://weather.yahoo.com/ ) und stellt auch eine Webdienstschnittstelle bereit ( http :/ /developer.yahoo.com/weather/ )
Aus den beiden oben genannten Webseiten können wir erkennen, dass die URL des von Yahoo! bereitgestellten Wetterdienstes http://xml.weather.yahoo.com/forecastrss lautet. Der Dienst verfügt außerdem über zwei Parameter:
p: den Standortcode Das Wetter soll abgefragt werden (Sie können diesen Code an verschiedenen Stellen unter http://weather.yahoo.com/ überprüfen).
u: Die Einheit der Temperatur im zurückgegebenen Ergebnis, f steht für Fahrenheit und c für Celsius.
Es scheint, dass dieser Yahoo!-Wetterdienst recht einfach ist. Lassen Sie uns testen, ob er gut funktioniert. Gehen Sie zunächst zu http://weather.yahoo.com/ und finden Sie heraus, dass der Standortcode von Shanghai CHXX0116 ist. Geben Sie dann http://xml.weather.yahoo.com/forecastrss?p=CHXX0116&u=c in den Browser ein. Nun wird das folgende nicht sehr komplizierte XML-Ergebnis zurückgegeben:
Yahoo Weather Service XML Result
<?xml version="1.0" binding="UTF-8" standalone="yes" ?>
<rss version="2.0" xmlns:yweather=" http://xml.weather.yahoo.com/ns/rss/1.0 " xmlns:geo=" http://www.w3.org/2003/01/geo /wgs84_pos #">
<Kanal>
<title>Yahoo! Wetter – Shanghai, CH</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html</link>
<description>Yahoo! Wetter für Shanghai, CH</description>
<Sprache>en-us</Sprache>
<lastBuildDate>Do, 25. Mai 2006 11:00 Uhr CST</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Shanghai" region="" country="CH" />
<yweather:units Temperature="C" distance="km" Pressure="mb" speed="kph" />
<yweather:wind chill="21" Direction="260" speed="14" />
<yweather:atmosphere feuchtigkeit="78" sichtbarkeit="299" druck="0" steigende="0" />
<yweather:astronomy Sunrise="4:52 Uhr" Sonnenuntergang="18:50 Uhr" />
<Bild>
<title>Yahoo! Wetter</title>
<width>142</width>
<height>18</height>
<link>http://weather.yahoo.com/</link>
<url>/u/info_img/2009-06/30/main_142b.gif</url>
</image>
<Artikel>
<title>Bedingungen für Shanghai, CH um 11:00 Uhr CST</title>
<geo:lat>31,17</geo:lat>
<geo:long>121,43</geo:long>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html</link>
<pubDate>Do, 25. Mai 2006, 11:00 Uhr CST</pubDate>
<yweather:condition text="Fog" code="20" temp="21" date="Do, 25. Mai 2006 11:00 Uhr CST" />
<Beschreibung>
<![CDATA[
<img src=" <b>Aktuelle Bedingungen:</b><br />
Nebel, 21 °C<BR /><BR />
<b>Prognose:</b><BR />
Do - Vereinzelte Gewitter. Höchstwert: 25. Tiefstwert: 20<br />
Fr. - Vormittags Regenschauer. Hoch: 26 Tief: 18<br />
<br />
<a href=" http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html"> Vollständige Vorhersage bei Yahoo! Wetter</a><BR/>
(bereitgestellt von The Weather Channel)<br/>
]]>
</description>
<yweather:forecast day="Thu" date="25 May 2006" low="20" high="25" text="Scattered Thunderstorms" code="38" />
<yweather:forecast day="Fri" date="26 May 2006" low="18" high="26" text="AM Showers" code="39" />
<guid isPermaLink="false">CHXX0116_2006_05_25_11_0_CST</guid>
</item>
</channel>
</rss>
<!-- p1.weather.scd.yahoo.com unkomprimiert/chunked Do 25. Mai 20:49:07 PDT 2006 -->
Wir können sehen, dass die bereitgestellten Informationen sehr umfassend sind (sogar die Sonnenauf- und -untergangszeiten ... ), lassen Sie uns die asbx-Bridge-Seite schreiben, um diesen Service zu verknüpfen.
Unter Bezugnahme auf die asbx-Anweisung im Artikel „Calling Web Service in ASP.NET Atlas – Creating Mashup to Call Remote Web Service (Grundkenntnisse und einfaches Beispiel)“ können wir zunächst den folgenden Absatz schreiben:
<?xml version= „1.0“-Kodierung ="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">
<proxy type="Microsoft.Web.Services.BridgeRestProxy"
serviceUrl=" http://xml.weather.yahoo.com/forecastrss " />
<method name="GetWeather">
<Eingabe>
<parameter name="p" />
<parameter name="u" value="c" />
</input>
</Methode>
</bridge>
In:
Die Namespace- und ClassName-Attribute von <bridge> und das Namensattribut von <method> ermöglichen uns den Zugriff auf dieses Mashup im Client-JavaScript über Methodensignaturen wie Dflying.YahooWeatherService.GetWeather().
Das serviceUrl-Attribut von <proxy> gibt die URL des Yahoo!-Wetterdienstes an.
Die GetWeather-Methode definiert die beiden oben aufgeführten Parameter p und u. Wir haben den Standardwert des u-Parameters als c (für Grad Celsius) angegeben und der p-Parameter wird vom Aufrufer übergeben.
Dieser Schritt reicht tatsächlich aus. Der Client erhält den oben im Browser angezeigten XML-String und kann auf dem Client verarbeitet und angezeigt werden. Die Verarbeitung von XML durch den Client ist jedoch nicht so einfach oder effizient, und die Übertragung zu vieler unnötiger Informationen über das Netzwerk ist ebenfalls eine Verschwendung. Hier verwenden wir also den in asbx integrierten Transformer, um dieses XML zu verarbeiten, den für uns interessanten Inhalt zu extrahieren und ihn in Form von JSON an den Client zu senden. Fügen Sie dem Abschnitt <method> den folgenden Absatz hinzu:
<transforms>
<transform type="Microsoft.Web.Services.XPathBridgeTransformer">
<Daten>
<attribute name="selector" value="channel" />
<dictionary name="namespaceMapping">
<item name="yweather" value=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</dictionary>
<Wörterbuchname="selectedNodes">
<item name="Title" value="title" />
<item name="Description" value="item/description" />
<item name="CurrentCondition" value="item/yweather:condition/@text" />
</dictionary>
</data>
</transform>
</transforms>
Die <transforms>-Anweisung gibt an, dass der Rückgabewert dieser Mashup-Methode von einigen Transformern geändert wird. Sie deklariert einen Transformer vom Typ Microsoft.Web.Services.XPathBridgeTransformer, was bedeutet, dass XPath-Ausdrücke für die Konvertierung verwendet werden. Die folgenden Teile sollten in diesem XPathBridgeTransformer deklariert werden:
Name ist ein Attributsegment des Selektors und das angegebene Wertattribut ist ein XPath-Ausdruck, der das Datensegment auswählt, das vom gesamten XPathBridgeTransformer verwendet wird.
name ist ein Wörterbuchsegment von namespaceMapping, das die Namespace-Zuordnung in dieser XML-Datei angibt. Wenn wir im folgenden Knotenauswahlprozess einen bestimmten Namensraum verwenden, muss dessen Deklaration hier sein. Hier fügen wir eine Zuordnung zu yweather hinzu, da diese im Folgenden verwendet wird.
Name ist ein Wörterbuchsegment von selectedNodes, wobei das Wertattribut jedes Elements ein XPath-String ist, der zur Auswahl des entsprechenden Werts aus XML verwendet wird, und das Namensattribut zur Angabe des entsprechenden Attributnamens in JavaScript verwendet wird. Als Beispiel habe ich hier nur drei Inhalte erhalten. Sie können sehen, dass das oben angegebene NamespaceMapping im XPath von CurrentCondition verwendet wird.
Ich werde nicht näher auf XPath eingehen. Freunde, die daran interessiert oder nicht damit vertraut sind, können es selbst googeln. Es gibt viele Online-Ressourcen. Ich bin mit anderen Arten von Transformern nicht sehr vertraut. Ich werde über sie sprechen, wenn ich ihnen in Zukunft begegne. Die fertige YahooWeatherBridge.asbx-Datei lautet wie folgt:
<?xml version="1.0" binding="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">
<proxy type="Microsoft.Web.Services.BridgeRestProxy"
serviceUrl=" http://xml.weather.yahoo.com/forecastrss " />
<method name="GetWeather">
<Eingabe>
<parameter name="p" />
<parameter name="u" value="c" />
</input>
<transformiert>
<transform type="Microsoft.Web.Services.XPathBridgeTransformer">
<Daten>
<attribute name="selector" value="channel" />
<dictionary name="namespaceMapping">
<item name="yweather" value=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</dictionary>
<Wörterbuchname="selectedNodes">
<item name="Title" value="title" />
<item name="Description" value="item/description" />
<item name="CurrentCondition" value="item/yweather:condition/@text" />
</dictionary>
</data>
</transform>
</transforms>
</Methode>
</bridge>
Erstellen Sie nun eine ASP.NET-Seite zum Testen. Zuerst wird der ScriptManager tausendmal wiederholt und ein Verweis auf Bridge: <atlas:ScriptManager ID="sm" runat="server">
<Dienste>
<atlas:ServiceReference Path="YahooWeatherBridge.asbx" />
</Dienste>
</atlas:ScriptManager>
Dann gibt es ein HTML-Select-Element, das mehrere Städte und entsprechende Stadtcodes auflistet:
<!-- place selector -->
<select id="place">
<option selected="selected" value="CHXX0116">Shanghai, CH</option>
<option value="USCA0746">Mountain View, CA</option>
<option value="CHXX0008">Peking, CH</option>
</select>
Eine HTML-Schaltfläche, die zum Auslösen des Aufrufs des Dienstes verwendet wird:
<!-- invoke the service -->
<input id="getWeather" type="button" value="Wetter abrufen" onclick="return getWeather_onclick()" />
Zur Anzeige des Ergebnisses wird ein HTML-Code verwendet:
<!-- display result -->
<div id="result" style="display: none;">
<div style="background-color: Grau; Schriftstärke: fett;">Titel</div>
<div id="title"></div>
<div style="background-color: Grau; Schriftstärke: fett;">Beschreibung</div>
<div id="description"></div>
</div>
Dann kommt JavaScript. Sie können sehen, dass Mashup über Dflying.YahooWeatherService.GetWeather() aufgerufen wird und der transformierte Wert auf der Seite ausgegeben wird, nachdem die Methode zurückgegeben wurde: function getWeather_onclick() {
// neues Atlas-'Select'-Steuerelement
var place = new Sys.UI.Select($('place'));
// die Bridge-Methode aufrufen
Dflying.YahooWeatherService.GetWeather({'p': place.get_selectedValue()}, onGetComplete);
}
Funktion onGetComplete(result) {
$('result').style.display = "block";
$('title').innerHTML = result[0].Title;
$('description').innerHTML = result[0].Description;
}