[索引页]
[源码下载]

从长计议Silverlight(1九) – 二.0通讯之调用REST服务,处理JSON格式, XML格式,
SportageSS/ATOM格式的数码

作者:webabcd

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

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

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

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

Json.xaml

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

Json.xaml.cs

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

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

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

Xml.xaml

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

Xml.xaml.cs

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

3、调用 REST 服务,返回 Rss/Atom 数据
Proxy.aspx.cs(重临钦定的url地址的故事情节的服务)

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

RssAtom.xaml

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

RssAtom.xaml.cs

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

OK
[源码下载]

相关文章

网站地图xml地图