zoukankan      html  css  js  c++  java
  • SilverLight学习笔记WebClient异步请求

    在向特定 URI 发送 HTTP 请求时,基于 HTTP 的服务将返回数据。

    HTTP 请求可以发送至各种 URI。此类 URI 包括 http://YouURL.com/service/getUserhttp://YouURL.com/service.svc/getUser 等,甚至包括静态数据,例如 http://YouURL.com/data.xml。配置 HTTP 请求通常使用表示检索的 GET 谓词,或者使用表示调用的 POST 谓词。被访问的服务可能要求随请求发送参数。对于 HTTP GET,参数通常附加在以下 URI 的结尾处:http://YouURL.com/service/getUser?id=123。对于 HTTP POST,所有参数都包括在 HTTP 请求的正文中。

    编写HttpHandler

    目的是模拟获取XML

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Web;

    using System.Web.Services;

    using System.Text;

     

    namespace SilverlightApplication9.Web

    {

        /// <summary>

        /// $codebehindclassname$ 的摘要说明

        /// </summary>

        [WebService(Namespace = "http://tempuri.org/")]

        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

        public class Handler1 : IHttpHandler

        {

     

            public void ProcessRequest(HttpContext context)

            {

                string s ;

                s=@"<body IsMember='true'>

                      <form_LRB>

                        <YYSRBQ>3536456.98</YYSRBQ>

                        <YYCBBQ>456798.00</YYCBBQ>

                        <XSFYBQ>3456.00</XSFYBQ>

                        <YYLRBQ>255456.32</YYLRBQ>

                      </form_LRB>

                      <head>

                        <createTime>2008-12-10</createTime>

                        <form>

                          <formId>ADGH4368FDG3465</formId>

                          <instanceId>DG2H9J-DG22HG-ASF42F-55FFG</instanceId>

                        </form>

                      </head>

                      <base>

                        <NSRMC>东莞市愉达玻璃装饰工程有限公司</NSRMC>

                      </base>

                    </body>";

                context.Response.ContentType = "text/plain";

                context.Response.Write(s);

            }

     

            public bool IsReusable

            {

                get

                {

                   return false;

                }

            }

        }

    }

    使用 XmlReader获取数据

    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;

    using System.Xml;

    using System.Xml.Linq;

     

    namespace SilverlightApplication9

    {

        public partial class Page : UserControl

        {

            public Page()

            {

                InitializeComponent();

                RequestsToHttpServices();

            }

     

            public void RequestsToHttpServices()

            {

                Uri serviceUri = new Uri("http://localhost:2584/Handler1.ashx");

                //这里也可以使用静态数据

                //Uri serviceUri = new Uri("http://localhost:2584/XMLFile1.xml");

                WebClient downloader = new WebClient();

                downloader.OpenReadCompleted += new OpenReadCompletedEventHandler(downloader_OpenReadCompleted);

                downloader.OpenReadAsync(serviceUri);

            }

     

            void downloader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

            {

                if (e.Error == null)

                {

                    Stream responseStream = e.Result;

     

                    XmlReader responseReader = XmlReader.Create(responseStream);

     

     

                    responseReader.ReadToFollowing("YYSRBQ");

                    decimal YYSRBQ = responseReader.ReadElementContentAsDecimal();

                    responseReader.ReadToFollowing("YYCBBQ");

                    decimal YYCBBQ = responseReader.ReadElementContentAsDecimal();

                    responseReader.ReadToFollowing("YYLRBQ");

                    decimal YYLRBQ = responseReader.ReadElementContentAsDecimal();

                    responseReader.ReadToFollowing("instanceId");

                    string instanceId= responseReader.ReadInnerXml();

                    responseReader.ReadToFollowing("NSRMC");

                    string name = responseReader.ReadInnerXml();

     

                    OutputText.Text = "表单实例:" + instanceId + ""n" + name + ""n营业收入:" + YYSRBQ + ""n营业成本:" + YYCBBQ + ""n营业利润:" + YYLRBQ;

     

                }

            }

        }

    }

    使用 JSON 数据

    stream 类型的 responseStream 对象中返回了下列 JSON:

    {"IsMember" : true, "Name" : "John", "Age" : 24}

    使用 DataContractJsonSerializer

    public class User

    {

        public bool IsMember { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

    }

    responseStream 反序列化为 User 对象

    DataContractJsonSerializer serializer =

        new DataContractJsonSerializer(typeof(User));

    User user = (User)serializer.ReadObject(responseStream);

    bool isMember = user.IsMember;

    string name = user.Name;

    int age = user.Age;

    使用 JsonObject LINQ

    Silverlight 提供了 jsonprimitivejsonarray jsonobject 类型,这些类型允许您以弱类型方式处理 JSON。此方法允许您动态地访问基元 JSON 类型(stringnumberBoolean)的值,并索引为结构化 JSON 类型(object array),而不需要预定义反序列化的目标类型(例如 User 类型)。下列代码演示如何执行此操作。

    JsonObject user = (JsonObject)JsonObject.Load(responseStream);

    bool isMember = user["IsMember"];

    string name = user["Name"];

    int age = user["Age"];

    使用 JsonObject LINQ 可以方便地处理复杂的 JSON 对象。例如,假定在 Stream 类型的 responseStream 对象中包含下列 JSON

    [{"IsMember" : true, "Name" : "John", "Age" : 24},

    {"IsMember" : false, "Name" : "Paul", "Age" : 44},

    {"IsMember" : true, "Name" : "George", "Age" : 12}]

    若要检索作为成员的所有人员,请对 JsonArray 对象使用以下 LINQ 查询。

    JsonArray users = (JsonArray)JsonArray.Load(responseStream);

    var members = from member in users

                  where member["IsMember"]

                  select member;

    foreach (JsonObject member in members)

    {

       string name = member["Name"];

       int age = member["Age"];

       // Do something...

    }

    关于作者: 王昕(QQ:475660) 在广州工作生活30余年。十多年开发经验,在Java、即时通讯、NoSQL、BPM、大数据等领域较有经验。
    目前维护的开源产品:https://gitee.com/475660
  • 相关阅读:
    JS数组的相关方法
    JS字符串的相关方法
    重回我的园区
    STM32F405串口UART4波特率注意问题
    NXP MCU开始学习中
    锂电池测试
    FPGA与STM32并口通信
    NXP LPC4350绝对强悍,准备入手学习
    SDRAM+FPGA+MCU
    STM32+FPGA通信成功
  • 原文地址:https://www.cnblogs.com/starcrm/p/1351771.html
Copyright © 2011-2022 走看看