在向特定 URI 发送 HTTP 请求时,基于 HTTP 的服务将返回数据。
HTTP 请求可以发送至各种 URI。此类 URI 包括 http://YouURL.com/service/getUser、http://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 提供了 jsonprimitive、jsonarray 和 jsonobject 类型,这些类型允许您以弱类型方式处理 JSON。此方法允许您动态地访问基元 JSON 类型(string、number、Boolean)的值,并索引为结构化 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...
}