网络编程全面解析:SOAP、JSON、RSS与Socket应用
立即解锁
发布时间: 2025-08-26 01:40:56 阅读量: 16 订阅数: 27 AIGC 

### 网络编程全面解析:SOAP、JSON、RSS与Socket应用
在网络编程领域,涉及到多种数据格式和通信方式,如SOAP、JSON、RSS以及Socket等。下面将详细介绍这些技术及其应用。
#### 1. 处理SOAP数据的服务
Silverlight能与.NET Web服务无缝协作,这些服务发送的是SOAP编码的数据。SOAP是XML的一种形式,理论上可以使用Silverlight的XML处理功能(如XDocument类)来创建请求消息和解析响应消息。不过,在Visual Studio中添加服务引用会更加便捷。而且,这种方法适用于任何基于SOAP的Web服务,Silverlight无法区分不同来源的SOAP服务。当添加Web引用时,Visual Studio会为你创建所需的代理类,其中包含异步方法和事件。
#### 2. 处理JSON数据的服务
JavaScript对象表示法(JSON)是一种对象表示语法,有时可作为XML的轻量级替代方案。当使用返回JSON数据且无SOAP替代方案的Web服务时,需要使用JSON序列化器。Silverlight提供了两种解析JSON数据的方法:使用JSON反序列化器或使用LINQ to JSON。在处理JSON数据之前,需要添加三个额外的程序集引用:System.Runtime.Serialization.dll、System.ServiceModel.dll和System.ServiceModel.Web.dll。
反序列化JSON类似于使用XmlSerializer类反序列化XML。首先,需要一个与JSON数据结构匹配的合适类,然后使用DataContractJsonSerializer类进行数据转换。例如,Yahoo!的图像搜索服务提供了JSON接口,返回的数据格式如下:
```json
{"ResultSet":{
"totalResultsAvailable":"957841",
"totalResultsReturned":10,
"firstResultPosition":1,
"Result":[
{
"Title":"tree_frog.jpg",
"Summary":"Red-Eyed Tree Frog",
"Url":"https:\/\/blue-sea-697d.quartiers047.workers.dev:443\/http\/www.thekidscollege.com\/images\/animals\/redeyetree_frog.jpg",
...
},
{
"Title":"tree_frog_large-thumb.jpg",
"Summary":"Before I came back in though I got another shot of the frog.",
"Url":"https:\/\/blue-sea-697d.quartiers047.workers.dev:443\/http\/www.silveriafamily.com\/blog\/john\/treefrog.jpg",
...
}
]
}}
```
为了用类来建模这些数据,需要为每个搜索结果(JSON中的Result)、整个结果集(JSON中的ResultSet)以及一个顶级类来持有搜索结果集创建类。类的属性名称必须与JSON表示中的名称完全匹配,包括大小写。以下是所需的类:
```csharp
public class SearchResults
{
public SearchResultSet ResultSet;
}
public class SearchResultSet
{
public int totalResultsAvailable { get; set; }
public int totalResultsReturned { get; set; }
public SearchResult[] Result { get; set; }
}
public class SearchResult
{
public string Title {get; set;}
public string Summary { get; set; }
public string Url { get; set; }
}
```
使用这些类反序列化搜索结果的步骤如下:
1. 创建DataContractJsonSerializer实例,指定要序列化或反序列化的类型:
```csharp
DataContractJsonSerializer serializer =
new DataContractJsonSerializer(typeof(SearchResults));
```
2. 使用ReadObject()方法反序列化JSON数据:
```csharp
SearchResults results = (SearchResults)serializer.ReadObject(jsonData);
```
下面是一个基于Silverlight的图像搜索页面的代码示例:
```csharp
private void cmdGetData_Click(object sender, RoutedEventArgs e)
{
WebClient client = new WebClient();
Uri address = new Uri(
"http://search.yahooapis.com/ImageSearchService/V1/imageSearch?" +
"appid=YahooDemo&query=" + HttpUtility.UrlEncode(txtSearchKeyword.Text) +
"&output=json");
client.OpenReadCompleted += client_OpenReadCompleted;
client.OpenReadAsync(address);
}
private void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
DataContractJsonSerializer serializer =
new DataContractJsonSerializer(typeof(SearchResults));
SearchResults results = (SearchResults)serializer.ReadObject(e.Result);
lblResultsTotal.Text = results.ResultSet.totalResultsAvailable +
" total results.";
lblResultsReturned.Text = results.ResultSet.totalResultsReturned +
" results returned.";
gridResults.ItemsSource = results.ResultSet.Result;
}
```
#### 3. RSS
简易信息聚合(RSS)是一种基于XML的格式,用于发布经常更新的内容摘要,如博客文章或新闻故事。这些文档称为提要,RSS阅读器客户端应用程序可以定期检查RSS提要并通知用户新添加的项目。
.NET 3.5引入了支持RSS 2.0或Atom 1.0格式的类,Silverlight借用了这些类,使你无需繁琐的XML解析代码即可读取提要信息。这些类定义在System.ServiceModel.Syndication命名空间中,需要添加对System.ServiceModel.Syndication.dll程序集的引用。
使用RSS时,需要注意跨域规则。如果尝试访问不允许跨域访问的Web服务器上的提要,会出现错误。此外,提要中的链接指向的页面也需要在允许跨域访问的Web服务器上。
以下是一个使用Silverlight读取RSS提要的示例:
```csharp
private void cmdGetData_Click(object sender, RoutedEventArgs e)
{
WebClient client = new WebClient();
Uri address = new Uri("http://feeds.feedburner.com/ZDNetBlogs");
client.OpenReadCompleted += client_OpenReadCompleted;
client.OpenReadAsync(address);
}
private void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
try
{
XmlReader reader = XmlReader.Create(e.Result);
SyndicationFeed feed = SyndicationFeed.Load(reader);
gridFeed.ItemsSource = feed.Items;
reader.Close();
}
catch
{
lblError.Text = "Error downloading feed.";
}
}
```
在XAML中显示提要信息的示例:
```xml
<data:DataGrid>
<data:DataGrid.Columns>
<data:DataGridTextColumn Binding="{Binding Title.Text}"
ElementStyle="{StaticResource DataGridWrapStyle}" />
<data:DataGridTextColumn Width="400"
Binding="{Binding Summary.Text, Converter={StaticResource HtmlCleanUp}}"
ElementStyle="{StaticResource DataGridWrapStyle}" />
</data:DataGrid.Columns>
</data:DataGrid>
```
当在DataGrid中点击项目时,显示完整文章的代码如下:
```csharp
private void gridFeed_SelectionChanged(object sender, EventArgs e)
{
// Get the selected syndication item.
SyndicationItem selectedItem = (SyndicationItem)gridFeed.SelectedItem;
// Find the <iframe> element on the page.
HtmlElement element = HtmlPage.Document.GetElementById("rssFrame");
// Point the <iframe> to the full page for the selected feed it
```
0
0
复制全文
相关推荐










