[索引页]
[源码下载]

稳扎稳打Silverlight(19) – 2.0通信的调用REST服务,处理JSON格式, XML格式,
RSS/ATOM格式的多少

作者: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
数据

在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html

示例
1、调用 REST 服务,返回 JSON 数据
REST.cs(WCF创建的REST服务)

图片 1using System;
图片 2using System.Linq;
图片 3using System.Runtime.Serialization;
图片 4using System.ServiceModel;
图片 5using System.ServiceModel.Activation;
图片 6
图片 7using System.ServiceModel.Web;
图片 8using System.Collections.Generic;
图片 9using System.Text;
图片 10using System.IO;
图片 11
图片 12图片 13/**//// <summary>
图片 14/// 提供 REST 服务之近乎
图片 15/// 注:Silverlight只支持 GET 和 POST
图片 16/// </summary>
图片 17[ServiceContract]
图片 18[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
图片 19public class REST
图片 20图片 21图片 22{
图片 23图片 24    /**//// <summary>
图片 25    /// 用于演示返回 JSON(对象) 的 REST 服务
图片 26    /// </summary>
图片 27    /// <param name=”name”></param>
图片 28    /// <returns></returns>
图片 29    [OperationContract]
图片 30    [WebGet(UriTemplate = “User/{name}/json”, ResponseFormat = WebMessageFormat.Json)]
图片 31    public User HelloJson(string name)
图片 32图片 33    图片 34{
图片 35图片 36        return new User 图片 37{ Name = name, DayOfBirth = new DateTime(1980, 2, 14) };
图片 38    }
图片 39
图片 40图片 41    /**//// <summary>
图片 42    /// 用于演示返回 JSON(集合) 的 REST 服务
图片 43    /// </summary>
图片 44    /// <returns></returns>
图片 45    [OperationContract]
图片 46    [WebGet(UriTemplate = “Users/json”, ResponseFormat = WebMessageFormat.Json)]
图片 47    public List<User> HelloJson2()
图片 48图片 49    图片 50{
图片 51        return new List<User> 
图片 52图片 53        图片 54
图片 55图片 56            new User()图片 57{ Name = “webabcd01”, DayOfBirth = new DateTime(1980, 1, 1) },
图片 58图片 59            new User()图片 60{ Name = “webabcd02”, DayOfBirth = new DateTime(1980, 2, 2) },
图片 61图片 62            new User()图片 63{ Name = “webabcd03”, DayOfBirth = new DateTime(1980, 3, 3) },
图片 64        };
图片 65    }
图片 66}
图片 67

Json.xaml

图片 68<UserControl x:Class=”Silverlight20.Communication.Json”
图片 69    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 70    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml"&gt;
图片 71    <StackPanel HorizontalAlignment=”Left” Width=”600″>
图片 72    
图片 73        <TextBox x:Name=”txtMsgJson” Margin=”5″ />
图片 74        <TextBox x:Name=”txtMsgJson2″ Margin=”5″ /> 
图片 75        
图片 76    </StackPanel>
图片 77</UserControl>
图片 78

Json.xaml.cs

图片 79using System;
图片 80using System.Collections.Generic;
图片 81using System.Linq;
图片 82using System.Net;
图片 83using System.Windows;
图片 84using System.Windows.Controls;
图片 85using System.Windows.Documents;
图片 86using System.Windows.Input;
图片 87using System.Windows.Media;
图片 88using System.Windows.Media.Animation;
图片 89using System.Windows.Shapes;
图片 90
图片 91using System.IO;
图片 92
图片 93namespace Silverlight20.Communication
图片 94图片 95图片 96{
图片 97    public partial class Json : UserControl
图片 98图片 99    图片 100{
图片 101        public Json()
图片 102图片 103        图片 104{
图片 105            InitializeComponent();
图片 106
图片 107            // 演示如何处理 JSON(对象)
图片 108            JsonDemo();
图片 109
图片 110            // 演示如何处理 JSON(集合)
图片 111            JsonDemo2();
图片 112        }
图片 113
图片 114图片 115        /**//// <summary>
图片 116        /// 演示如何处理 JSON(对象)
图片 117        /// </summary>
图片 118        void JsonDemo()
图片 119图片 120        图片 121{
图片 122            // REST 服务的 URL
图片 123            Uri uri = new Uri(“http://localhost:3036/REST.svc/User/webabcd/json”, UriKind.Absolute);
图片 124
图片 125            // 实例化 WebClient
图片 126            System.Net.WebClient client = new System.Net.WebClient();
图片 127
图片 128            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(json_DownloadStringCompleted);
图片 129            client.DownloadStringAsync(uri);
图片 130
图片 131            txtMsgJson.Text = “读取 JSON(对象) 数据中。。。”;
图片 132        }
图片 133
图片 134        void json_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
图片 135图片 136        图片 137{
图片 138            if (e.Error != null)
图片 139图片 140            图片 141{
图片 142                // 发生错误的言辞,则打印出来
图片 143                txtMsgJson.Text = e.Error.ToString();
图片 144                return;
图片 145            }
图片 146
图片 147            // 将取的字符串转换为 JSON(对象)
图片 148            var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
图片 149            var ms = new MemoryStream(buffer);
图片 150            var jsonObject = System.Json.JsonObject.Load(ms) as System.Json.JsonObject;
图片 151
图片 152            txtMsgJson.Text = e.Result + “\r\n”;
图片 153            // 解析 JSON(对象)
图片 154            txtMsgJson.Text += string.Format(“姓名: {0}, 生日: {1}”,
图片 155                (string)jsonObject[“Name”],
图片 156                ((DateTime)jsonObject[“DayOfBirth”]).ToString(“yyyy-MM-dd”));
图片 157
图片 158图片 159            /**//* 
图片 160             * 总结:
图片 161             * JsonObject – 一个存有零要么多个 key-value 对之无序聚集。继承自抽象类 JsonValue
图片 162             *     JsonObject.Load(Stream) – 将点名的字符串流反序列化为 JSON 对象(CLR可用的种)
图片 163             *     JsonObject[key] – JsonObject 索引器,获取 JsonObject 的指定key的value
图片 164             *     JsonObject.ContainsKey(key) – JsonObject 对象内是否享有指定的key
图片 165             */
图片 166        }
图片 167
图片 168图片 169        /**//// <summary>
图片 170        /// 演示如何处理 JSON(集合)
图片 171        /// </summary>
图片 172        void JsonDemo2()
图片 173图片 174        图片 175{
图片 176            // REST 服务的 URL
图片 177            Uri uri = new Uri(“http://localhost:3036/REST.svc/Users/json”, UriKind.Absolute);
图片 178
图片 179            // 实例化 WebClient
图片 180            System.Net.WebClient client = new System.Net.WebClient();
图片 181
图片 182            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(json2_DownloadStringCompleted);
图片 183            client.DownloadStringAsync(uri);
图片 184
图片 185            txtMsgJson2.Text = “读取 JSON(集合) 数据中。。。”;
图片 186        }
图片 187
图片 188        void json2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
图片 189图片 190        图片 191{
图片 192            if (e.Error != null)
图片 193图片 194            图片 195{
图片 196                // 发生误的言辞,则打印出
图片 197                txtMsgJson2.Text = e.Error.ToString();
图片 198                return;
图片 199            }
图片 200
图片 201            // 将获得的字符串转换为 JSON(集合)
图片 202            var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
图片 203            var ms = new MemoryStream(buffer);
图片 204            var jsonArray = System.Json.JsonArray.Load(ms) as System.Json.JsonArray;
图片 205
图片 206            txtMsgJson2.Text = e.Result + “\r\n”;
图片 207            txtMsgJson2.Text += string.Format(“姓名: {0}, 生日: {1}”,
图片 208                (string)jsonArray.First()[“Name”],
图片 209                ((DateTime)jsonArray.Single(p => p[“Name”] == “webabcd02”)[“DayOfBirth”]).ToString(“yyyy-MM-dd”));
图片 210
图片 211图片 212            /**//* 
图片 213             * 总结:
图片 214             * JsonArray – 一个有所零要多个 JsonValue(抽象类,JsonObject和JsonArray都累自此类) 对象的稳步序列
图片 215             *     JsonArray.Load(Stream) – 将点名的字符串流反序列化为 JSON 对象(CLR可用的型)
图片 216             *     JsonArray[index] – JsonArray 索引器,获取 JsonArray 的指定索引的 JsonValue
图片 217             *     JsonArray 支持 LINQ
图片 218             */
图片 219        }
图片 220    }
图片 221}
图片 222

2、调用 REST 服务,返回 XML 数据
REST.cs(WCF创建的REST服务)

图片 223using System;
图片 224using System.Linq;
图片 225using System.Runtime.Serialization;
图片 226using System.ServiceModel;
图片 227using System.ServiceModel.Activation;
图片 228
图片 229using System.ServiceModel.Web;
图片 230using System.Collections.Generic;
图片 231using System.Text;
图片 232using System.IO;
图片 233
图片 234图片 235/**//// <summary>
图片 236/// 提供 REST 服务之好像
图片 237/// 注:Silverlight只支持 GET 和 POST
图片 238/// </summary>
图片 239[ServiceContract]
图片 240[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
图片 241public class REST
图片 242图片 243图片 244{
图片 245图片 246    /**//// <summary>
图片 247    /// 用于演示返回 XML(对象) 的 REST 服务
图片 248    /// </summary>
图片 249    /// <param name=”name”></param>
图片 250    /// <returns></returns>
图片 251    [OperationContract]
图片 252    [WebGet(UriTemplate = “User/{name}/xml”, ResponseFormat = WebMessageFormat.Xml)]
图片 253    public User HelloXml(string name)
图片 254图片 255    图片 256{
图片 257图片 258        return new User 图片 259{ Name = name, DayOfBirth = new DateTime(1980, 2, 14) };
图片 260    }
图片 261
图片 262图片 263    /**//// <summary>
图片 264    /// 用于演示返回 XML(集合) 的 REST 服务
图片 265    /// </summary>
图片 266    /// <returns></returns>
图片 267    [OperationContract]
图片 268    [WebGet(UriTemplate = “Users/xml”, ResponseFormat = WebMessageFormat.Xml)]
图片 269    public List<User> HelloXml2()
图片 270图片 271    图片 272{
图片 273        return new List<User> 
图片 274图片 275        图片 276
图片 277图片 278            new User()图片 279{ Name = “webabcd01”, DayOfBirth = new DateTime(1980, 1, 1) },
图片 280图片 281            new User()图片 282{ Name = “webabcd02”, DayOfBirth = new DateTime(1980, 2, 2) },
图片 283图片 284            new User()图片 285{ Name = “webabcd03”, DayOfBirth = new DateTime(1980, 3, 3) },
图片 286        };
图片 287    }
图片 288}
图片 289

Xml.xaml

图片 290<UserControl x:Class=”Silverlight20.Communication.Xml”
图片 291    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 292    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml"&gt;
图片 293    <StackPanel HorizontalAlignment=”Left” Width=”600″>
图片 294
图片 295        <TextBox x:Name=”txtMsgXml” Margin=”5″ />
图片 296        <TextBox x:Name=”txtMsgXml2″ Margin=”5″ />
图片 297
图片 298    </StackPanel>
图片 299</UserControl>
图片 300

Xml.xaml.cs

图片 301using System;
图片 302using System.Collections.Generic;
图片 303using System.Linq;
图片 304using System.Net;
图片 305using System.Windows;
图片 306using System.Windows.Controls;
图片 307using System.Windows.Documents;
图片 308using System.Windows.Input;
图片 309using System.Windows.Media;
图片 310using System.Windows.Media.Animation;
图片 311using System.Windows.Shapes;
图片 312
图片 313using System.Xml.Linq;
图片 314using System.IO;
图片 315
图片 316namespace Silverlight20.Communication
图片 317图片 318图片 319{
图片 320    public partial class Xml : UserControl
图片 321图片 322    图片 323{
图片 324        public Xml()
图片 325图片 326        图片 327{
图片 328            InitializeComponent();
图片 329
图片 330            // 演示如何处理 XML(对象)
图片 331            XmlDemo();
图片 332
图片 333            // 演示如何处理 XML(集合)
图片 334            XmlDemo2();
图片 335        }
图片 336
图片 337图片 338        /**//// <summary>
图片 339        /// 演示如何处理 XML(对象)
图片 340        /// </summary>
图片 341        void XmlDemo()
图片 342图片 343        图片 344{
图片 345            // REST 服务的 URL
图片 346            Uri uri = new Uri(“http://localhost:3036/REST.svc/User/webabcd/xml”, UriKind.Absolute);
图片 347
图片 348            // 实例化 WebClient
图片 349            System.Net.WebClient client = new System.Net.WebClient();
图片 350
图片 351            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xml_DownloadStringCompleted);
图片 352            client.DownloadStringAsync(uri);
图片 353
图片 354            txtMsgXml.Text = “读取 XML(对象) 数据中。。。”;
图片 355        }
图片 356
图片 357        void xml_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
图片 358图片 359        图片 360{
图片 361            if (e.Error != null)
图片 362图片 363            图片 364{
图片 365                // 发生误的说话,则打印出
图片 366                txtMsgXml.Text = e.Error.ToString();
图片 367                return;
图片 368            }
图片 369
图片 370            // 将获的字符串转换为 XML(对象)
图片 371            var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
图片 372            var ms = new MemoryStream(buffer);
图片 373
图片 374            XElement xmlObject = XElement.Load(ms);
图片 375
图片 376            txtMsgXml.Text = e.Result + “\r\n”;
图片 377            XNamespace ns = “http://webabcd.cnblogs.com/”;
图片 378            txtMsgXml.Text += string.Format(“姓名: {0}, 生日: {1}”,
图片 379                (string)xmlObject.Element(ns + “Name”),
图片 380                ((DateTime)xmlObject.Element(ns + “DayOfBirth”)).ToString(“yyyy-MM-dd”));
图片 381
图片 382图片 383            /**//* 
图片 384             * 总结:
图片 385             * XElement – 代表一个 XML 元素
图片 386             *     XElement.Element – XML 元素内的 XML 元素
图片 387             *     XElement.Attribute – XML 元素内之 XML 属性
图片 388             *     XElement.Load(Stream) – 使用指定流创建一个 XElement 对象
图片 389             *     XElement.Parse(String) – 解析指定的 XML 字符串为一个 XElement 对象
图片 390             * XAttribute – 表示一个 XML 属性
图片 391             */
图片 392        }
图片 393
图片 394图片 395        /**//// <summary>
图片 396        /// 演示如何处理 XML(集合)
图片 397        /// </summary>
图片 398        void XmlDemo2()
图片 399图片 400        图片 401{
图片 402            // REST 服务的 URL
图片 403            Uri uri = new Uri(“http://localhost:3036/REST.svc/Users/xml”, UriKind.Absolute);
图片 404
图片 405            // 实例化 WebClient
图片 406            System.Net.WebClient client = new System.Net.WebClient();
图片 407
图片 408            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xml2_DownloadStringCompleted);
图片 409            client.DownloadStringAsync(uri);
图片 410
图片 411            txtMsgXml2.Text = “读取 XML(集合) 数据中。。。”;
图片 412        }
图片 413
图片 414        void xml2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
图片 415图片 416        图片 417{
图片 418            if (e.Error != null)
图片 419图片 420            图片 421{
图片 422                // 发生误的言辞,则打印出
图片 423                txtMsgXml2.Text = e.Error.ToString();
图片 424                return;
图片 425            }
图片 426
图片 427            // 将得到的字符串转换为 XML(集合)
图片 428            XDocument xmlObject = XDocument.Parse(e.Result);
图片 429
图片 430            txtMsgXml2.Text = e.Result + “\r\n”;
图片 431            XNamespace ns = “http://webabcd.cnblogs.com/”;
图片 432            var obj = from p in xmlObject.Elements(ns + “ArrayOfUser”).Elements(ns + “User”)
图片 433                      where p.Element(ns + “Name”).Value == “webabcd02”
图片 434图片 435                      select new 图片 436{ Name = (string)p.Element(ns + “Name”), DayOfBirth = (DateTime)p.Element(ns + “DayOfBirth”) };
图片 437            
图片 438            txtMsgXml2.Text += string.Format(“姓名: {0}, 生日: {1}”,
图片 439                obj.First().Name,
图片 440                obj.First().DayOfBirth.ToString(“yyyy-MM-dd”));
图片 441
图片 442
图片 443图片 444            /**//* 
图片 445             * 总结:
图片 446             * LINQ to XML 相当之好
图片 447             */
图片 448        }
图片 449    }
图片 450}
图片 451

3、调用 REST 服务,返回 Rss/Atom 数据
Proxy.aspx.cs(返回指定的url地址之始末之服务)

图片 452using System;
图片 453using System.Collections.Generic;
图片 454using System.Linq;
图片 455using System.Web;
图片 456using System.Web.UI;
图片 457using System.Web.UI.WebControls;
图片 458
图片 459public partial class Proxy : System.Web.UI.Page
图片 460图片 461图片 462{
图片 463    protected void Page_Load(object sender, EventArgs e)
图片 464图片 465    图片 466{
图片 467        // 获取有 url 地址的 html 并以页面及输出
图片 468
图片 469        string url = Request.QueryString[“url”];
图片 470
图片 471        System.Net.WebClient client = new System.Net.WebClient();
图片 472        client.Encoding = System.Text.Encoding.UTF8;
图片 473
图片 474        Response.Write(client.DownloadString(url));
图片 475        Response.End();
图片 476    }
图片 477}
图片 478

RssAtom.xaml

图片 479<UserControl x:Class=”Silverlight20.Communication.RssAtom”
图片 480    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 481    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml"&gt;
图片 482    <StackPanel HorizontalAlignment=”Left” >
图片 483
图片 484        <TextBox x:Name=”txtMsgRss” Width=”600″ Margin=”5″ />
图片 485
图片 486        <StackPanel Orientation=”Horizontal”>
图片 487        
图片 488            <ListBox x:Name=”list” Width=”300″ Margin=”5″ SelectionChanged=”list_SelectionChanged”>
图片 489                <ListBox.ItemTemplate>
图片 490                    <DataTemplate>
图片 491                        <TextBlock Text=”{Binding Title.Text}”></TextBlock>
图片 492                    </DataTemplate>
图片 493                </ListBox.ItemTemplate>
图片 494            </ListBox>
图片 495
图片 496            <TextBlock x:Name=”detail” Width=”300″ Margin=”5″ Text=”{Binding Summary.Text}” TextWrapping=”Wrap” />
图片 497            
图片 498        </StackPanel>
图片 499        
图片 500    </StackPanel>
图片 501</UserControl>
图片 502

RssAtom.xaml.cs

图片 503using System;
图片 504using System.Collections.Generic;
图片 505using System.Linq;
图片 506using System.Net;
图片 507using System.Windows;
图片 508using System.Windows.Controls;
图片 509using System.Windows.Documents;
图片 510using System.Windows.Input;
图片 511using System.Windows.Media;
图片 512using System.Windows.Media.Animation;
图片 513using System.Windows.Shapes;
图片 514
图片 515using System.Xml;
图片 516using System.IO;
图片 517using System.ServiceModel.Syndication;
图片 518
图片 519namespace Silverlight20.Communication
图片 520图片 521图片 522{
图片 523    public partial class RssAtom : UserControl
图片 524图片 525    图片 526{
图片 527        public RssAtom()
图片 528图片 529        图片 530{
图片 531            InitializeComponent();
图片 532
图片 533            // 演示如何处理 Rss/Atom
图片 534            RssDemo();
图片 535        }
图片 536
图片 537图片 538        /**//// <summary>
图片 539        /// 演示如何处理 Rss/Atom
图片 540        /// </summary>
图片 541        void RssDemo()
图片 542图片 543        图片 544{
图片 545            // 让一个摄页面去要相关的 Rss/Atom(如果因此Silverlight直接去请,则用以目标域的根目录下配置策略文件)
图片 546            Uri uri = new Uri(“http://localhost:3036/Proxy.aspx?url=http://webabcd.cnblogs.com/rss”, UriKind.Absolute);
图片 547
图片 548            // 实例化 WebClient
图片 549            System.Net.WebClient client = new System.Net.WebClient();
图片 550
图片 551            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(rss_DownloadStringCompleted);
图片 552            client.DownloadStringAsync(uri);
图片 553
图片 554            txtMsgRss.Text = “读取 RSS 数据中。。。”;
图片 555        }
图片 556
图片 557        void rss_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
图片 558图片 559        图片 560{
图片 561            if (e.Error != null)
图片 562图片 563            图片 564{
图片 565                // 发生错误的语句,则打印出来
图片 566                txtMsgRss.Text = e.Error.ToString();
图片 567                return;
图片 568            }
图片 569
图片 570            // 将获得的字符串转换为 XmlReader
图片 571            var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
图片 572            var ms = new MemoryStream(buffer);
图片 573            XmlReader reader = XmlReader.Create(ms);
图片 574
图片 575            // 从指定的 XmlReader 中加载,以那个成 SyndicationFeed
图片 576            SyndicationFeed feed = SyndicationFeed.Load(reader);
图片 577
图片 578            // 设置 list 的数据源为 Rss/Atom 的起集合(SyndicationFeed.Items)
图片 579            list.ItemsSource = feed.Items;
图片 580            txtMsgRss.Text = e.Result + “\r\n”;
图片 581        }
图片 582
图片 583        private void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
图片 584图片 585        图片 586{
图片 587            // 设置 detail 的数上下文为 Rss/Atom 的指定项(SyndicationItem)
图片 588            detail.DataContext = list.SelectedItem as SyndicationItem;
图片 589        }
图片 590    }
图片 591}
图片 592

OK
[源码下载]

相关文章

网站地图xml地图