首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 图形图象-> 相关软件
在asp.net atlas中调用web service—创建mashup调用远端web service(yahoo!天气实例)_asp.net技巧
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

作者:Dflying Chen (http://dflying.cnblogs.com/
在前一篇文章(在ASP.NET Atlas中调用Web Service——创建Mashup调用远端Web Service(基础知识以及简单示例))中,我介绍了一些Atlas中对远程Web Service进行Mashup的基础知识,并给出了一个最基础的没有丝毫用处例子。今天再回到这个话题上,我将给出一个更复杂点的,但有一些用处的例子——Yahoo! Weather。

废话到此为止,让我们先熟悉一下Yahoo! Weather服务:Yahoo!在其网站上提供了天气预报服务(http://weather.yahoo.com/),并且它也提供了Web Service的接口(http://developer.yahoo.com/weather/
从上面两个网页上面,我们可以知道Yahoo!提供的天气Service的URL为http://xml.weather.yahoo.com/forecastrss,该服务还有两个参数:

p:要查询天气的地点代码(可以在http://weather.yahoo.com/查询到不同地方的这个代码)。
u:返回结果中温度的单位,f代表华氏度,c代表摄氏度。
看来这个Yahoo! Weather服务还挺简单的,让我们测试下好不好用。先到http://weather.yahoo.com/查出来上海的地点代码为CHXX0116。然后在浏览器中输入http://xml.weather.yahoo.com/forecastrss?p=CHXX0116&u=c,嗯,返回了如下的一段不是很复杂的XML:

Yahoo Weather Service XML Result
<?xml version="1.0" encoding="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#">
  <channel>
    <title>Yahoo! Weather - 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! Weather for Shanghai, CH</description>
    <language>en-us</language>
    <lastBuildDate>Thu, 25 May 2006 11:00 am 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 humidity="78" visibility="299" pressure="0" rising="0" />
    <yweather:astronomy sunrise="4:52 am" sunset="6:50 pm" />
    <image>
      <title>Yahoo! Weather</title>
      <width>142</width>
      <height>18</height>
      <link>http://weather.yahoo.com/</link>
      <url>http://us.i1.yimg.com/us.yimg.com/i/us/nws/th/main_142b.gif</url>
    </image>
    <item>
      <title>Conditions for Shanghai, CH at 11:00 am 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>Thu, 25 May 2006 11:00 am CST</pubDate>
      <yweather:condition text="Fog" code="20" temp="21" date="Thu, 25 May 2006 11:00 am CST" />
      <description>
        <![CDATA[
          <img src="http://www.knowsky.com/http://us.i1.yimg.com/us.yimg.com/i/us/we/52/20.gif" /><br />
           <b>Current Conditions:</b><br />
           Fog, 21 C<BR /><BR />
           <b>Forecast:</b><BR />
            Thu - Scattered Thunderstorms. High: 25 Low: 20<br />
            Fri - AM Showers. High: 26 Low: 18<br />
           <br />
          <a href="Full>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html">Full Forecast at Yahoo! Weather</a><BR/>
           (provided by 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 uncompressed/chunked Thu May 25 20:49:07 PDT 2006 -->

我们可以看到,它提供的信息非常全面(连日出日落时间都有……),下面让我们书写asbx Bridge页面来对这个Service进行Mashup。

首先,参考在ASP.NET Atlas中调用Web Service——创建Mashup调用远端Web Service(基础知识以及简单示例)这篇文章中的那个asbx的声明,我们可以写出如下一段:

<?xml version="1.0" encoding="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">

  <proxy type="Microsoft.Web.Services.BridgeRestProxy"
         serviceUrl="http://xml.weather.yahoo.com/forecastrss" />

  <method name="GetWeather">
    <input>
      <parameter name="p" />
      <parameter name="u" value="c" />
    </input>
  </method>
</bridge>

 

其中:
<bridge>的namespace和className属性以及<method>的name属性让我们在客户端JavaScript中可以通过Dflying.YahooWeatherService.GetWeather()这样的方法签名来访问这个Mashup。
<proxy>的serviceUrl属性指定了Yahoo! Weather Service的URL。
GetWeather方法中定义了上面列出来的p和u两个参数,其中u参数我们指定了它的默认值为c(代表摄氏度),p参数将由调用者负责传过来。
写到这一步其实也够了,客户端将收到上面浏览器中看到的那一段XML String,并且可以在客户端进行处理并显示。但客户端对XML的处理并不是那么容易,也不是那么高效,同时通过网络传输太多不必要的信息也是一种浪费。所以这里我们利用asbx中内建的Transformer对这段XML处理一下,提取出我们感兴趣的内容并以JSON的形式发给客户端。在<method>段中加入下面一段:

<transforms>
  <transform type="Microsoft.Web.Services.XPathBridgeTransformer">
    <data>
      <attribute name="selector" value="channel" />
      <dictionary name="namespaceMapping">
        <item name="yweather" value="http://xml.weather.yahoo.com/ns/rss/1.0" />
      </dictionary>
      <dictionary name="selectedNodes">
        <item name="Title" value="title" />
        <item name="Description" value="item/description" />
        <item name="CurrentCondition" value="item/yweather:condition/@text" />
      </dictionary>
    </data>
  </transform>
</transforms>

 

其中<transforms>声明表示这个Mashup方法的返回值将会被一些transformer改变一下,里面声明了一个类型为Microsoft.Web.Services.XPathBridgeTransformer的transformer,表示将用XPath表达式来转换。在这个XPathBridgeTransformer中要声明如下部分:
name为selector的一个attribute段,其中指定的value属性为一个XPath表达式,将选取整个XPathBridgeTransformer将用到的数据段。
name为namespaceMapping的一个dictionary段,其中指定了这个XML文件中的namespace映射。如果在下面的选择节点过程中我们用到了某个namespace,那么这里就必须有它的声明。这里我们在其中添加一个对yweather的映射,因为下面要用到。
name为selectedNodes的一个dictionary段,其中每一个item的value属性是一个XPath String,用来从XML中选择出相应的值,name属性用来指定相应的在JavaScript中的属性名称。这里作为示例,我只取得其中三段内容,您可以看到,其中CurrentCondition的XPath中用到了上面指定的namespaceMapping。
关于XPath的知识,我就不多讲了,感兴趣或是不太熟悉的朋友可以自行Google,网上资源很多。关于其他类型的Transformer,我也不是很熟悉,今后如果遇到了我再讲讲。完成后的YahooWeatherBridge.asbx文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">

  <proxy type="Microsoft.Web.Services.BridgeRestProxy"
         serviceUrl="http://xml.weather.yahoo.com/forecastrss" />

  <method name="GetWeather">
    <input>
      <parameter name="p" />
      <parameter name="u" value="c" />
    </input>
    <transforms>
      <transform type="Microsoft.Web.Services.XPathBridgeTransformer">
        <data>
          <attribute name="selector" value="channel" />
          <dictionary name="namespaceMapping">
            <item name="yweather" value="http://xml.weather.yahoo.com/ns/rss/1.0" />
          </dictionary>
          <dictionary name="selectedNodes">
            <item name="Title" value="title" />
            <item name="Description" value="item/description" />
            <item name="CurrentCondition" value="item/yweather:condition/@text" />
          </dictionary>
        </data>
      </transform>
    </transforms>
  </method>
</bridge>

 

现在创建一个ASP.NET Page测试一下,首先依然是重复了一千遍的ScriptManager,还有对Bridge的引用: <atlas:ScriptManager ID="sm" runat="server">
    <Services>
        <atlas:ServiceReference Path="YahooWeatherBridge.asbx" />
    </Services>
</atlas:ScriptManager>
然后一个HTML Select元素,里面列入了几个城市以及相应的城市代码:

<!-- place selector -->
<select id="place">
    <option selected="selected" value="CHXX0116">Shanghai, CH</option>
    <option value="USCA0746">Mountain View, CA</option>
    <option value="CHXX0008">Beijing, CH</option>
</select>
一个HTML Button,用来触发对Service的调用:

<!-- invoke the service -->
<input id="getWeather" type="button" value="Get Weather" onclick="return getWeather_onclick()" />
一段HTML用来显示结果:

<!-- display result -->
<div id="result" style="display: none;">
    <div style="background-color: Gray; font-weight: bold;">Title</div>
    <div id="title"></div>
    <div style="background-color: Gray; font-weight: bold;">Description</div>
    <div id="description"></div>
</div>

 

然后是JavaScript,可以看到通过Dflying.YahooWeatherService.GetWeather()调用了Mashup,并在方法返回后把经过transform的值输出到了页面上: function getWeather_onclick() {
    // new atlas Select control
    var place = new Sys.UI.Select($(place));
   
    // invoke the bridge method
    Dflying.YahooWeatherService.GetWeather({p: place.get_selectedValue()}, onGetComplete);
}
function onGetComplete(result) {
    $(result).style.display = "block";
    $(title).innerHTML = result[0].Title;
    $(description).innerHTML = result[0].Description;
}


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用C#在进度条中显示复制文件的进度-.NET教程,C#语言
·JAVASCRIPT调用JAVA-JSP教程,Java技巧及代码
·Java开源项目Hibernate包作用详解-JSP教程,Java技巧及代码
·新型单相逆变电源的研制
·解读Windows 2000/XP分层驱动模型-.NET教程,Windows开发
·NET中打印包含有格式的 RichTextBox 的内容-.NET教程,Asp.Net开发
·java用于链接数据库的例子(*.properties)-JSP教程,资料/其它
·cable modem及其系统的配置和使用
·asp.net 1.1/ 2.0 中快速实现单点登陆-.NET教程,Asp.Net开发
·持续集成 Java手册-JSP教程,Java技巧及代码
最新文章
·像我一样的菜鸟站长常犯的几种错误_站长心得
·网友开博客真的能赚钱吗?_网赚技巧
·google广告代码可以放到几个网站吗?_网赚技巧
·论坛如何最佳化?adsense最佳化案例_网赚技巧
·姚劲波:站长要用开放平和的心态去坚持_站长访谈
·章征军和他的站长网_站长访谈
·建自己想建的站坚持下去 就是最好的seo_站长心得
·autocad 2008的service pack 1测试版发布_autocad教程
·网站的定位在于选题(后半部分参考市场报)_站长心得
·互联网赚钱的几种基本模式_站长心得
相关主题
  • 在asp.net中实现会话状态基础_asp.net技巧
  • 在asp.net中使用session常见问题集锦_asp.net技巧
  • 在asp.net中把图片保存到sql server数据库(vb.net) _asp.net技巧
  • 在asp.net应用程序中捕捉身份验证状态的变化 _asp.net技巧
  • 在asp.net中访问sql 2005报表服务 _asp.net技巧
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭