天天看點

上接穩紮穩打Silverlight(19) - 2.0通信之調用REST服務,處理JSON格式, XML格式, RSS/ATOM格式的資料

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,如需轉載請自行聯系原作者