[索引页]
[源码下载]

从长远的角度考虑Silverlight(19) – 2.0通讯之调用REST服务,处理JSON格式, XML格式,
安德拉SS/ATOM格式的多少

作者:webabcd

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

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

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

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

Json.xaml

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

Json.xaml.cs

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

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

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

Xml.xaml

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

Xml.xaml.cs

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

3、调用 REST 服务,返回 Rss/Atom 数据
json,Proxy.aspx.cs(重回钦命的url地址的始末的劳务)

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

RssAtom.xaml

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

RssAtom.xaml.cs

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

OK
[源码下载]

相关文章

网站地图xml地图