本文写在http://www.cnblogs.com/Ivan-Yan/archive/2010/01/16/1649479.html这篇文章基础之上;
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服务的调用