作者:webabcd


介绍
Silverlight 2.0 调用REST服务,处理JSON格式, XML格式, RSS/ATOM格式的数据
    通过 System.Net.WebClient 类调用 REST 服务
    通过 System.Json 命名控件下的类处理 JSON 数据
    通过 System.Xml.Linq 命名空间下的类(LINQ to XML)处理 XML 数据
    通过 System.ServiceModel.Syndication 命名空间下的类处理 RSS/ATOM 数据

示例
1、调用 REST 服务,返回 JSON 数据
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>
    
/// 用于演示返回 JSON(对象) 的 REST 服务
    
/// </summary>
    
/// <param name="name"></param>
    
/// <returns></returns>
    [OperationContract]
    [WebGet(UriTemplate = "User/{name}/json", ResponseFormat = WebMessageFormat.Json)]
    public User HelloJson(string name)
    {
        return new User { Name = name, DayOfBirth = new DateTime(1980214) };
    }

    /**//// <summary>
    
/// 用于演示返回 JSON(集合) 的 REST 服务
    
/// </summary>
    
/// <returns></returns>
    [OperationContract]
    [WebGet(UriTemplate = "Users/json", ResponseFormat = WebMessageFormat.Json)]
    public List<User> HelloJson2()
    {
        return new List<User> 
        { 
            new User(){ Name = "webabcd01", DayOfBirth = new DateTime(198011) },
            new User(){ Name = "webabcd02", DayOfBirth = new DateTime(198022) },
            new User(){ Name = "webabcd03", DayOfBirth = new DateTime(198033) },
        };
    }
}

Json.xaml 
<UserControl x:Class="Silverlight20.Communication.Json"
    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="txtMsgJson" Margin="5" />
        <TextBox x:Name="txtMsgJson2" Margin="5" /> 
        
    </StackPanel>
</UserControl>
Json.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
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.IO;

namespace Silverlight20.Communication
{
    public partial class Json : UserControl
    {
        public Json()
        {
            InitializeComponent();

            // 演示如何处理 JSON(对象)
            JsonDemo();

            // 演示如何处理 JSON(集合)
            JsonDemo2();
        }

        /**//// <summary>
        
/// 演示如何处理 JSON(对象)
        
/// </summary>
        void JsonDemo()
        {
            // REST 服务的 URL
            Uri uri = new Uri("http://localhost:3036/REST.svc/User/webabcd/json", UriKind.Absolute);

            // 实例化 WebClient
            System.Net.WebClient client = new System.Net.WebClient();

            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(json_DownloadStringCompleted);
            client.DownloadStringAsync(uri);

            txtMsgJson.Text = "读取 JSON(对象) 数据中。。。";
        }

        void json_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // 发生错误的话,则打印出来
                txtMsgJson.Text = e.Error.ToString();
                return;
            }

            // 将获得的字符串转换为 JSON(对象)
            var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
            var ms = new MemoryStream(buffer);
            var jsonObject = System.Json.JsonObject.Load(ms) as System.Json.JsonObject;

            txtMsgJson.Text = e.Result + "\r\n";
            // 解析 JSON(对象)
            txtMsgJson.Text += string.Format("姓名: {0}, 生日: {1}",
                (string)jsonObject["Name"],
                ((DateTime)jsonObject["DayOfBirth"]).ToString("yyyy-MM-dd"));

            /**//* 
             * 总结:
             * JsonObject - 一个具有零或多个 key-value 对的无序集合。继承自抽象类 JsonValue
             *     JsonObject.Load(Stream) - 将指定的字符串流反序列化为 JSON 对象(CLR可用的类型)
             *     JsonObject[key] - JsonObject 索引器,获取 JsonObject 的指定key的value
             *     JsonObject.ContainsKey(key) - JsonObject 对象内是否具有指定的key
             
*/
        }

        /**//// <summary>
        
/// 演示如何处理 JSON(集合)
        
/// </summary>
        void JsonDemo2()
        {
            // REST 服务的 URL
            Uri uri = new Uri("http://localhost:3036/REST.svc/Users/json", UriKind.Absolute);

            // 实例化 WebClient
            System.Net.WebClient client = new System.Net.WebClient();

            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(json2_DownloadStringCompleted);
            client.DownloadStringAsync(uri);

            txtMsgJson2.Text = "读取 JSON(集合) 数据中。。。";
        }

        void json2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // 发生错误的话,则打印出来
                txtMsgJson2.Text = e.Error.ToString();
                return;
            }

            // 将获得的字符串转换为 JSON(集合)
            var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
            var ms = new MemoryStream(buffer);
            var jsonArray = System.Json.JsonArray.Load(ms) as System.Json.JsonArray;

            txtMsgJson2.Text = e.Result + "\r\n";
            txtMsgJson2.Text += string.Format("姓名: {0}, 生日: {1}",
                (string)jsonArray.First()["Name"],
                ((DateTime)jsonArray.Single(p => p["Name"] == "webabcd02")["DayOfBirth"]).ToString("yyyy-MM-dd"));

            /**//* 
             * 总结:
             * JsonArray - 一个具有零或多个 JsonValue(抽象类,JsonObject和JsonArray都继承自此类) 对象的有序序列
             *     JsonArray.Load(Stream) - 将指定的字符串流反序列化为 JSON 对象(CLR可用的类型)
             *     JsonArray[index] - JsonArray 索引器,获取 JsonArray 的指定索引的 JsonValue
             *     JsonArray 支持 LINQ
             
*/
        }
    }
}
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(1980214) };
    }

    /**//// <summary>
    
/// 用于演示返回 XML(集合) 的 REST 服务
    
/// </summary>
    
/// <returns></returns>
    [OperationContract]
    [WebGet(UriTemplate = "Users/xml", ResponseFormat = WebMessageFormat.Xml)]
    public List<User> HelloXml2()
    {
        return new List<User> 
        { 
            new User(){ Name = "webabcd01", DayOfBirth = new DateTime(198011) },
            new User(){ Name = "webabcd02", DayOfBirth = new DateTime(198022) },
            new User(){ Name = "webabcd03", DayOfBirth = new DateTime(198033) },
        };
    }
}

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;
using System.Collections.Generic;
using System.Linq;
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;
using System.IO;

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 属性
             
*/
        }

        /**//// <summary>
        
/// 演示如何处理 XML(集合)
        
/// </summary>
        void XmlDemo2()
        {
            // REST 服务的 URL
            Uri uri = new Uri("http://localhost:3036/REST.svc/Users/xml", UriKind.Absolute);

            // 实例化 WebClient
            System.Net.WebClient client = new System.Net.WebClient();

            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xml2_DownloadStringCompleted);
            client.DownloadStringAsync(uri);

            txtMsgXml2.Text = "读取 XML(集合) 数据中。。。";
        }

        void xml2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // 发生错误的话,则打印出来
                txtMsgXml2.Text = e.Error.ToString();
                return;
            }

            // 将获得的字符串转换为 XML(集合)
            XDocument xmlObject = XDocument.Parse(e.Result);

            txtMsgXml2.Text = e.Result + "\r\n";
            XNamespace ns = "http://webabcd.cnblogs.com/";
            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;
using System.Collections.Generic;
using System.Linq;
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"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml">
    <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>
        
    </StackPanel>
</UserControl>
RssAtom.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
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;
using System.IO;
using System.ServiceModel.Syndication;

namespace Silverlight20.Communication
{
    public partial class RssAtom : UserControl
    {
        public RssAtom()
        {
            InitializeComponent();

            // 演示如何处理 Rss/Atom
            RssDemo();
        }

        /**//// <summary>
        
/// 演示如何处理 Rss/Atom
        
/// </summary>
        void RssDemo()
        {
            // 让一个代理页面去请求相关的 Rss/Atom(如果用Silverlight直接去请求,则需要在目标域的根目录下配置策略文件)
            Uri uri = new Uri("http://localhost:3036/Proxy.aspx?url=http://webabcd.cnblogs.com/rss", UriKind.Absolute);

            // 实例化 WebClient
            System.Net.WebClient client = new System.Net.WebClient();

            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(rss_DownloadStringCompleted);
            client.DownloadStringAsync(uri);

            txtMsgRss.Text = "读取 RSS 数据中。。。";
        }

        void rss_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // 发生错误的话,则打印出来
                txtMsgRss.Text = e.Error.ToString();
                return;
            }

            // 将获得的字符串转换为 XmlReader
            var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
            var ms = new MemoryStream(buffer);
            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;
        }
    }
}







posted on 2011-10-09 14:33  arong.NET  阅读(611)  评论(0编辑  收藏  举报