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

   本文写在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服务的调用


你可能感兴趣的:(api,String,Yahoo,silverlight,WCF,dataset)