利用yahoo天气预报API创建自己的WCF服务

WCF的服务模式一般为在服务端创建服务,在客户端来调用这个服务,本文件是以Silverlight客户端调用来实现。首先创建一个WCF服务,定义DataSet作为返回值,而在silverlight客户端可以得到一个ArrayOfXElement类型的返回值,用messageBox输出可以知道,此数据为一个xml结构的数据;

WCF服务端:

添加using System.Xml; using System.Collections; using System.Data;三个命名空间

  1. namespace WeatherReport.Web  
  2. {  
  3.     [ServiceContract(Namespace = "")]  
  4.     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]  
  5.     public class weatherService  
  6.     {  
  7.         [OperationContract]  
  8.         public void DoWork()  
  9.         {  
  10.             // 在此处添加操作实现  
  11.             return;  
  12.         }  
  13.   
  14.         [OperationContract]  
  15.         public DataSet getWeather(string strCityName)  
  16.         {  
  17.             string strXml = "http://xml.weather.yahoo.com/forecastrss?p=CHXX" + CityNameToCityNum(strCityName);  
  18.             XmlDocument Weather = new XmlDocument();  
  19.             Weather.Load(strXml);  
  20.   
  21.             XmlNamespaceManager namespacemanager = new XmlNamespaceManager(Weather.NameTable);  
  22.             namespacemanager.AddNamespace("yweather", "http://xml.weather.yahoo.com/ns/rss/1.0");  
  23.             XmlNodeList nodes = Weather.SelectNodes("/rss/channel/item/yweather:forecast", namespacemanager);  
  24.   
  25.             DataSet ds = new DataSet();  
  26.             DataTable dt = new DataTable("weatherMessage");  
  27.             ds.Tables.Add(dt);  
  28.   
  29.             ds.Tables["weatherMessage"].Columns.Add("Data", typeof(string));  
  30.             ds.Tables["weatherMessage"].Columns.Add("Week", typeof(string));  
  31.             ds.Tables["weatherMessage"].Columns.Add("Weather", typeof(string));  
  32.             ds.Tables["weatherMessage"].Columns.Add("Tlow", typeof(string));  
  33.             ds.Tables["weatherMessage"].Columns.Add("Thigh", typeof(string));  
  34.   
  35.             if (nodes.Count > 0)  
  36.             {  
  37.                 foreach (XmlNode node in nodes)  
  38.                 {  
  39.                     DataRow dr = ds.Tables["weatherMessage"].NewRow();  
  40.                     dr["Data"] = EmonthToCmonth(node.SelectSingleNode("@date").Value.ToString());  
  41.                     dr["Week"] = EweekToCweek(node.SelectSingleNode("@day").Value.ToString()) + "(" + node.SelectSingleNode("@day").Value.ToString() + ")";  
  42.                     dr["Weather"] = node.SelectSingleNode("@text").Value;  
  43.                     dr["Tlow"] = FToC(int.Parse(node.SelectSingleNode("@low").Value)) + "℃";  
  44.                     dr["Thigh"] = FToC(int.Parse(node.SelectSingleNode("@high").Value)) + "℃";  
  45.                     ds.Tables["weatherMessage"].Rows.Add(dr);  
  46.                 }  
  47.                 return ds;  
  48.             }  
  49.             else  
  50.             {  
  51.                 DataRow dr = ds.Tables["weatherMessage"].NewRow();  
  52.                 dr["Data"] = "None";  
  53.                 dr["Week"] = "None";  
  54.                 dr["Weather"] = "None";  
  55.                 dr["Tlow"] = "None";  
  56.                 dr["Thigh"] = "None";  
  57.   
  58.                 ds.Tables["weatherMessage"].Rows.Add(dr);  
  59.                 return ds;  
  60.             }  
  61.   
  62.         }  
  63.   
  64.         /// <summary>  
  65.         /// 从华氏转换成摄氏  
  66.         /// </summary>  
  67.         /// <param name="f">华氏度</param>  
  68.         /// <returns></returns>  
  69.         [OperationContract]  
  70.         private string FToC(int f)  
  71.         {  
  72.             return Math.Round((f - 32) / 1.8, 1).ToString();  
  73.         }  
  74.   
  75.         /// <summary>  
  76.         /// 从星期英文缩写转汉字  
  77.         /// </summary>  
  78.         /// <param name="strEweek">星期的英文缩写</param>  
  79.         /// <returns></returns>  
  80.         [OperationContract]  
  81.         private string EweekToCweek(string strEweek)  
  82.         {  
  83.             switch (strEweek)  
  84.             {  
  85.                 case "Mon":  
  86.                     return "星期一";  
  87.                 // break;  
  88.                 case "Tue":  
  89.                     return "星期二";  
  90.                 // break;  
  91.                 case "Wed":  
  92.                     return "星期三";  
  93.                 // break;  
  94.                 case "Thu":  
  95.                     return "星期四";  
  96.                 //break;  
  97.                 case "Fri":  
  98.                     return "星期五";  
  99.                 //break;  
  100.                 case "Sat":  
  101.                     return "星期六";  
  102.                 // break;  
  103.                 case "Sun":  
  104.                     return "星期日";  
  105.                 // break;  
  106.                 default:  
  107.                     return "传参错误";  
  108.                 // break;  
  109.             }  
  110.         }  
  111.   
  112.         /// <summary>  
  113.         /// 从月英文缩写转汉字  
  114.         /// </summary>  
  115.         /// <param name="strReplace">需要替换的年月日</param>  
  116.         /// <returns></returns>  
  117.         [OperationContract]  
  118.         private string EmonthToCmonth(string strReplace)  
  119.         {  
  120.             return Convert.ToDateTime(strReplace).ToString("yyyy年MM月dd日");  
  121.         }  
  122.   
  123.         /// <summary>  
  124.         /// 根据城市名称返回城市编号  
  125.         /// </summary>  
  126.         /// <param name="strCityName">城市名称</param>  
  127.         /// <returns></returns>  
  128.         [OperationContract]  
  129.         private string CityNameToCityNum(string strCityNameToNum)  
  130.         {  
  131.             //中国各个省会和直辖市对应的查询代码  
  132.             Hashtable htWeather = new Hashtable();  
  133.             htWeather.Add("北京", "0008");  
  134.             htWeather.Add("天津", "0133");  
  135.             htWeather.Add("杭州", "0044");  
  136.             htWeather.Add("合肥", "0448");  
  137.             htWeather.Add("上海", "0116");  
  138.             htWeather.Add("福州", "0031");  
  139.             htWeather.Add("重庆", "0017");  
  140.             htWeather.Add("南昌", "0097");  
  141.             htWeather.Add("香港", "0049");  
  142.             htWeather.Add("济南", "0064");  
  143.             htWeather.Add("澳门", "0512");  
  144.             htWeather.Add("郑州", "0165");  
  145.             htWeather.Add("呼和浩特", "0249");  
  146.             htWeather.Add("乌鲁木齐", "0135");  
  147.             htWeather.Add("长沙", "0013");  
  148.             htWeather.Add("银川", "0259");  
  149.             htWeather.Add("广州", "0037");  
  150.             htWeather.Add("拉萨", "0080");  
  151.             htWeather.Add("海口", "0502");  
  152.             htWeather.Add("南宁", "0100");  
  153.             htWeather.Add("成都", "0016");  
  154.             htWeather.Add("石家庄", "0122");  
  155.             htWeather.Add("贵阳", "0039");  
  156.             htWeather.Add("太原", "0129");  
  157.             htWeather.Add("昆明", "0076");  
  158.             htWeather.Add("沈阳", "0119");  
  159.             htWeather.Add("西安", "0141");  
  160.             htWeather.Add("长春", "0010");  
  161.             htWeather.Add("兰州", "0079");  
  162.             htWeather.Add("西宁", "0236");  
  163.             htWeather.Add("南京", "0099");  
  164.   
  165.             object cityNum = htWeather[strCityNameToNum];  
  166.   
  167.             if (cityNum == null)  
  168.             {  
  169.                 return "City not found";  
  170.             }  
  171.             else  
  172.             {  
  173.                 return cityNum.ToString();  
  174.             }  
  175.         }  
  176.         // 在此处添加更多操作并使用 [OperationContract] 标记它们  
  177.     }  
  178. }  

 

  1. silverlight客户端:  
  2.   
  3. private WCFService.weatherServiceClient sc = new WCFService.weatherServiceClient();  
  4.   
  5.         public void addEvent()  
  6.         {  
  7.             sc.getWeatherCompleted += new EventHandler<WCFService.getWeatherCompletedEventArgs>(sc_getWeatherCompleted);  
  8.         }  
  9.   
  10.         void sc_getWeatherCompleted(object sender, WCFService.getWeatherCompletedEventArgs e)  
  11.         {  
  12.             var result = e.Result;  
  13.             var s = from item in result.Nodes[1].Descendants("weatherMessage")  
  14.                     select new  
  15.                     {  
  16.                         Data = item.Element("Data").Value,  
  17.                         Week = item.Element("Week").Value,  
  18.                         Weather = item.Element("Weather").Value,  
  19.                         Tlow = item.Element("Tlow").Value,  
  20.                         Thigh = item.Element("Thigh").Value  
  21.                     };  
  22.             foreach (var v in s)  
  23.             {  
  24.                 MessageBox.Show(v.Data + "--" + v.Weather);  
  25.             }  
  26.         }  
  27.   
  28.         
  29.   
  30.         private void Button_Click(object sender, RoutedEventArgs e)  
  31.         {  
  32.   
  33.              addEvent();  
  34.             sc.getWeatherAsync("北京");  
  35.         }  
  36.   
  37. 这样,就完成了对WCF服务的调用  
  38. 原文地址:http://blog.csdn.net/neil89/article/month/2011/11

posted on 2012-04-19 15:36  俄罗斯水手  阅读(454)  评论(0)    收藏  举报

导航