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