利用yahoo天气预报API创建自己的WCF服务
WCF的服务模式一般为在服务端创建服务,在客户端来调用这个服务,本文件是以Silverlight客户端调用来实现。首先创建一个WCF服务,定义DataSet作为返回值,而在silverlight客户端可以得到一个ArrayOfXElement类型的返回值,用messageBox输出可以知道,此数据为一个xml结构的数据;
WCF服务端:
添加using System.Xml; using System.Collections; using System.Data;三个命名空间
- namespace WeatherReport.Web
- {
- [ServiceContract(Namespace = "")]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class weatherService
- {
- [OperationContract]
- public void DoWork()
- {
- // 在此处添加操作实现
- return;
- }
- [OperationContract]
- public DataSet getWeather(string strCityName)
- {
- string strXml = "http://xml.weather.yahoo.com/forecastrss?p=CHXX" + CityNameToCityNum(strCityName);
- XmlDocument Weather = new XmlDocument();
- Weather.Load(strXml);
- XmlNamespaceManager namespacemanager = new XmlNamespaceManager(Weather.NameTable);
- namespacemanager.AddNamespace("yweather", "http://xml.weather.yahoo.com/ns/rss/1.0");
- XmlNodeList nodes = Weather.SelectNodes("/rss/channel/item/yweather:forecast", namespacemanager);
- DataSet ds = new DataSet();
- DataTable dt = new DataTable("weatherMessage");
- ds.Tables.Add(dt);
- ds.Tables["weatherMessage"].Columns.Add("Data", typeof(string));
- ds.Tables["weatherMessage"].Columns.Add("Week", typeof(string));
- ds.Tables["weatherMessage"].Columns.Add("Weather", typeof(string));
- ds.Tables["weatherMessage"].Columns.Add("Tlow", typeof(string));
- ds.Tables["weatherMessage"].Columns.Add("Thigh", typeof(string));
- if (nodes.Count > 0)
- {
- foreach (XmlNode node in nodes)
- {
- DataRow dr = ds.Tables["weatherMessage"].NewRow();
- dr["Data"] = EmonthToCmonth(node.SelectSingleNode("@date").Value.ToString());
- dr["Week"] = EweekToCweek(node.SelectSingleNode("@day").Value.ToString()) + "(" + node.SelectSingleNode("@day").Value.ToString() + ")";
- dr["Weather"] = node.SelectSingleNode("@text").Value;
- dr["Tlow"] = FToC(int.Parse(node.SelectSingleNode("@low").Value)) + "℃";
- dr["Thigh"] = FToC(int.Parse(node.SelectSingleNode("@high").Value)) + "℃";
- ds.Tables["weatherMessage"].Rows.Add(dr);
- }
- return ds;
- }
- else
- {
- DataRow dr = ds.Tables["weatherMessage"].NewRow();
- dr["Data"] = "None";
- dr["Week"] = "None";
- dr["Weather"] = "None";
- dr["Tlow"] = "None";
- dr["Thigh"] = "None";
- ds.Tables["weatherMessage"].Rows.Add(dr);
- return ds;
- }
- }
- /// <summary>
- /// 从华氏转换成摄氏
- /// </summary>
- /// <param name="f">华氏度</param>
- /// <returns></returns>
- [OperationContract]
- private string FToC(int f)
- {
- return Math.Round((f - 32) / 1.8, 1).ToString();
- }
- /// <summary>
- /// 从星期英文缩写转汉字
- /// </summary>
- /// <param name="strEweek">星期的英文缩写</param>
- /// <returns></returns>
- [OperationContract]
- private string EweekToCweek(string strEweek)
- {
- switch (strEweek)
- {
- case "Mon":
- return "星期一";
- // break;
- case "Tue":
- return "星期二";
- // break;
- case "Wed":
- return "星期三";
- // break;
- case "Thu":
- return "星期四";
- //break;
- case "Fri":
- return "星期五";
- //break;
- case "Sat":
- return "星期六";
- // break;
- case "Sun":
- return "星期日";
- // break;
- default:
- return "传参错误";
- // break;
- }
- }
- /// <summary>
- /// 从月英文缩写转汉字
- /// </summary>
- /// <param name="strReplace">需要替换的年月日</param>
- /// <returns></returns>
- [OperationContract]
- private string EmonthToCmonth(string strReplace)
- {
- return Convert.ToDateTime(strReplace).ToString("yyyy年MM月dd日");
- }
- /// <summary>
- /// 根据城市名称返回城市编号
- /// </summary>
- /// <param name="strCityName">城市名称</param>
- /// <returns></returns>
- [OperationContract]
- private string CityNameToCityNum(string strCityNameToNum)
- {
- //中国各个省会和直辖市对应的查询代码
- Hashtable htWeather = new Hashtable();
- htWeather.Add("北京", "0008");
- htWeather.Add("天津", "0133");
- htWeather.Add("杭州", "0044");
- htWeather.Add("合肥", "0448");
- htWeather.Add("上海", "0116");
- htWeather.Add("福州", "0031");
- htWeather.Add("重庆", "0017");
- htWeather.Add("南昌", "0097");
- htWeather.Add("香港", "0049");
- htWeather.Add("济南", "0064");
- htWeather.Add("澳门", "0512");
- htWeather.Add("郑州", "0165");
- htWeather.Add("呼和浩特", "0249");
- htWeather.Add("乌鲁木齐", "0135");
- htWeather.Add("长沙", "0013");
- htWeather.Add("银川", "0259");
- htWeather.Add("广州", "0037");
- htWeather.Add("拉萨", "0080");
- htWeather.Add("海口", "0502");
- htWeather.Add("南宁", "0100");
- htWeather.Add("成都", "0016");
- htWeather.Add("石家庄", "0122");
- htWeather.Add("贵阳", "0039");
- htWeather.Add("太原", "0129");
- htWeather.Add("昆明", "0076");
- htWeather.Add("沈阳", "0119");
- htWeather.Add("西安", "0141");
- htWeather.Add("长春", "0010");
- htWeather.Add("兰州", "0079");
- htWeather.Add("西宁", "0236");
- htWeather.Add("南京", "0099");
- object cityNum = htWeather[strCityNameToNum];
- if (cityNum == null)
- {
- return "City not found";
- }
- else
- {
- return cityNum.ToString();
- }
- }
- // 在此处添加更多操作并使用 [OperationContract] 标记它们
- }
- }
- silverlight客户端:
- private WCFService.weatherServiceClient sc = new WCFService.weatherServiceClient();
- public void addEvent()
- {
- sc.getWeatherCompleted += new EventHandler<WCFService.getWeatherCompletedEventArgs>(sc_getWeatherCompleted);
- }
- void sc_getWeatherCompleted(object sender, WCFService.getWeatherCompletedEventArgs e)
- {
- var result = e.Result;
- var s = from item in result.Nodes[1].Descendants("weatherMessage")
- select new
- {
- Data = item.Element("Data").Value,
- Week = item.Element("Week").Value,
- Weather = item.Element("Weather").Value,
- Tlow = item.Element("Tlow").Value,
- Thigh = item.Element("Thigh").Value
- };
- foreach (var v in s)
- {
- MessageBox.Show(v.Data + "--" + v.Weather);
- }
- }
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- addEvent();
- sc.getWeatherAsync("北京");
- }
- 这样,就完成了对WCF服务的调用
- 原文地址:http://blog.csdn.net/neil89/article/month/2011/11
浙公网安备 33010602011771号