2、調用 REST 服務,傳回 XML 資料
REST.cs(WCF建立的REST服務)
using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Collections.Generic;
using System.Text;
using System.IO;
/// <summary>
/// 提供 REST 服務的類
/// 注:Silverlight隻支援 GET 和 POST
/// </summary>
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class REST
{
/// <summary>
/// 用于示範傳回 XML(對象) 的 REST 服務
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[OperationContract]
[WebGet(UriTemplate = "User/{name}/xml", ResponseFormat = WebMessageFormat.Xml)]
public User HelloXml(string name)
{
return new User { Name = name, DayOfBirth = new DateTime(1980, 2, 14) };
}
/// 用于示範傳回 XML(集合) 的 REST 服務
[WebGet(UriTemplate = "Users/xml", ResponseFormat = WebMessageFormat.Xml)]
public List<User> HelloXml2()
return new List<User>
{
new User(){ Name = "webabcd01", DayOfBirth = new DateTime(1980, 1, 1) },
new User(){ Name = "webabcd02", DayOfBirth = new DateTime(1980, 2, 2) },
new User(){ Name = "webabcd03", DayOfBirth = new DateTime(1980, 3, 3) },
};
}
Xml.xaml
<UserControl x:Class="Silverlight20.Communication.Xml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel HorizontalAlignment="Left" Width="600">
<TextBox x:Name="txtMsgXml" Margin="5" />
<TextBox x:Name="txtMsgXml2" Margin="5" />
</StackPanel>
</UserControl>
Xml.xaml.cs
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml.Linq;
namespace Silverlight20.Communication
public partial class Xml : UserControl
public Xml()
{
InitializeComponent();
// 示範如何處理 XML(對象)
XmlDemo();
// 示範如何處理 XML(集合)
XmlDemo2();
}
/// <summary>
/// 示範如何處理 XML(對象)
/// </summary>
void XmlDemo()
// REST 服務的 URL
Uri uri = new Uri("http://localhost:3036/REST.svc/User/webabcd/xml", UriKind.Absolute);
// 執行個體化 WebClient
System.Net.WebClient client = new System.Net.WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xml_DownloadStringCompleted);
client.DownloadStringAsync(uri);
txtMsgXml.Text = "讀取 XML(對象) 資料中。。。";
void xml_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
if (e.Error != null)
{
// 發生錯誤的話,則列印出來
txtMsgXml.Text = e.Error.ToString();
return;
}
// 将獲得的字元串轉換為 XML(對象)
var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
var ms = new MemoryStream(buffer);
XElement xmlObject = XElement.Load(ms);
txtMsgXml.Text = e.Result + "\r\n";
XNamespace ns = "http://webabcd.cnblogs.com/";
txtMsgXml.Text += string.Format("姓名: {0}, 生日: {1}",
(string)xmlObject.Element(ns + "Name"),
((DateTime)xmlObject.Element(ns + "DayOfBirth")).ToString("yyyy-MM-dd"));
/*
* 總結:
* XElement - 表示一個 XML 元素
* XElement.Element - XML 元素内的 XML 元素
* XElement.Attribute - XML 元素内的 XML 屬性
* XElement.Load(Stream) - 使用指定流建立一個 XElement 對象
* XElement.Parse(String) - 解析指定的 XML 字元串為一個 XElement 對象
* XAttribute - 表示一個 XML 屬性
*/
/// 示範如何處理 XML(集合)
void XmlDemo2()
Uri uri = new Uri("http://localhost:3036/REST.svc/Users/xml", UriKind.Absolute);
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xml2_DownloadStringCompleted);
txtMsgXml2.Text = "讀取 XML(集合) 資料中。。。";
void xml2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
txtMsgXml2.Text = e.Error.ToString();
// 将獲得的字元串轉換為 XML(集合)
XDocument xmlObject = XDocument.Parse(e.Result);
txtMsgXml2.Text = e.Result + "\r\n";
var obj = from p in xmlObject.Elements(ns + "ArrayOfUser").Elements(ns + "User")
where p.Element(ns + "Name").Value == "webabcd02"
select new { Name = (string)p.Element(ns + "Name"), DayOfBirth = (DateTime)p.Element(ns + "DayOfBirth") };
txtMsgXml2.Text += string.Format("姓名: {0}, 生日: {1}",
obj.First().Name,
obj.First().DayOfBirth.ToString("yyyy-MM-dd"));
* LINQ to XML 相當的友善
}
3、調用 REST 服務,傳回 Rss/Atom 資料
Proxy.aspx.cs(傳回指定的url位址的内容的服務)
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Proxy : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
// 擷取某個 url 位址的 html 并在頁面上輸出
string url = Request.QueryString["url"];
System.Net.WebClient client = new System.Net.WebClient();
client.Encoding = System.Text.Encoding.UTF8;
Response.Write(client.DownloadString(url));
Response.End();
RssAtom.xaml
<UserControl x:Class="Silverlight20.Communication.RssAtom"
<StackPanel HorizontalAlignment="Left" >
<TextBox x:Name="txtMsgRss" Width="600" Margin="5" />
<StackPanel Orientation="Horizontal">
<ListBox x:Name="list" Width="300" Margin="5" SelectionChanged="list_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title.Text}"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock x:Name="detail" Width="300" Margin="5" Text="{Binding Summary.Text}" TextWrapping="Wrap" />
</StackPanel>
RssAtom.xaml.cs
using System.Xml;
using System.ServiceModel.Syndication;
public partial class RssAtom : UserControl
public RssAtom()
// 示範如何處理 Rss/Atom
RssDemo();
/// 示範如何處理 Rss/Atom
void RssDemo()
// 讓一個代理頁面去請求相關的 Rss/Atom(如果用Silverlight直接去請求,則需要在目标域的根目錄下配置政策檔案)
Uri uri = new Uri("http://localhost:3036/Proxy.aspx?url=http://webabcd.cnblogs.com/rss", UriKind.Absolute);
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(rss_DownloadStringCompleted);
txtMsgRss.Text = "讀取 RSS 資料中。。。";
void rss_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
txtMsgRss.Text = e.Error.ToString();
// 将獲得的字元串轉換為 XmlReader
XmlReader reader = XmlReader.Create(ms);
// 從指定的 XmlReader 中加載,以生成 SyndicationFeed
SyndicationFeed feed = SyndicationFeed.Load(reader);
// 設定 list 的資料源為 Rss/Atom 的項集合(SyndicationFeed.Items)
list.ItemsSource = feed.Items;
txtMsgRss.Text = e.Result + "\r\n";
private void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
// 設定 detail 的資料上下文為 Rss/Atom 的指定項(SyndicationItem)
detail.DataContext = list.SelectedItem as SyndicationItem;
OK
<a href="http://down.51cto.com/data/100302" target="_blank">[源碼下載下傳]</a>
本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/343113,如需轉載請自行聯系原作者