网络编程:HTML抓取、REST服务与网络凭证使用
立即解锁
发布时间: 2025-08-26 01:38:47 阅读量: 15 订阅数: 26 AIGC 


Silverlight 5编程与应用实例解析
### 网络编程:HTML 抓取、REST 服务与网络凭证使用
在网络编程中,我们常常需要从网页获取信息、调用网络服务以及处理网络凭证。下面将详细介绍 HTML 抓取、REST 等简单网络服务的使用,以及如何使用网络凭证。
#### 1. HTML 抓取
HTML 抓取是从网页原始标记中提取信息的一种方法。虽然这种方法比较脆弱,因为网页结构一旦改变,代码的假设可能就会失效,但在某些情况下,它是唯一的选择。例如,在亚马逊和 eBay 等网站提供网络服务之前,开发者常使用屏幕抓取技术来获取价格详情、销售排名和产品图片等信息。
##### 1.1 示例表格
以下是一个包含不同历史时期世界人口数据的 HTML 表格示例:
```html
<table>
<tr>
<th>Year</th>
<th width="70">World</th>
</tr>
<tr>
<th>70,000 BCE</th>
<td>2</td>
</tr>
<tr>
<th>10,000 BCE</th>
<td>1,000</td>
</tr>
<tr>
<th>9000 BCE</th>
<td>3,000</td>
</tr>
...
</table>
```
##### 1.2 使用 WebClient 下载 HTML 页面
WebClient 类可以用于下载整个 HTML 文档。对于较小的文本内容,可以使用 `DownloadStringAsync()` 方法,该方法会将结果作为单个字符串返回。以下是点击“Get Data”按钮时的代码:
```csharp
private void cmdGetData_Click(object sender, RoutedEventArgs e)
{
WebClient client = new WebClient();
Uri address = new Uri("http://localhost:" +
HtmlPage.Document.DocumentUri.Port + "/ASPWebSite/PopulationTable.html");
client.DownloadStringCompleted += client_DownloadStringCompleted;
client.DownloadStringAsync(address);
}
```
**提示**:在开始像这样的异步操作时,是更新用户界面状态消息的好时机。例如,可以在 TextBlock 中显示“Contacting web service”。
##### 1.3 处理下载结果
以下是处理下载结果的代码:
```csharp
private void client_DownloadStringCompleted(object sender,
DownloadStringCompletedEventArgs e)
{
string pageHtml = "";
try
{
pageHtml = e.Result;
}
catch
{
lblResult.Text = "Error contacting service.";
return;
}
// 后续处理代码...
}
```
当读取 `Result` 属性时,如果网络请求失败(例如指定的网页无法找到或不允许跨域访问),会抛出异常,因此需要异常处理代码。
##### 1.4 使用正则表达式提取信息
为了从 HTML 字符串中提取所需信息,使用正则表达式会更方便。正则表达式是一种模式匹配语言,常用于搜索文本或验证输入。在这个示例中,需要找到以下形式的 HTML 片段:
`<th>500 BCE</th><td>100,000</td>`
可以使用命名组来构造正则表达式,示例如下:
```csharp
string pattern = "<th>" + txtYear.Text + "</th>" + @"\s*" + "<td>" +
"(?<population>.*)" + "</td>";
Regex regex = new Regex(pattern);
Match match = regex.Match(pageHtml);
string people = match.Groups["population"].Value;
if (people == "")
lblResult.Text = "Year not found.";
else
lblResult.Text = match.Groups["population"].Value + " people.";
```
#### 2. REST 和其他简单网络服务
近年来,简单网络服务重新兴起,这些服务避免了详细的 SOAP 协议和 WS - * 标准的复杂性。简单网络服务虽然不能替代基于 SOAP 的网络服务,但它们简洁的结构使其成为构建需要与最广泛客户端兼容的公共网络服务的理想选择。许多顶级网站(如亚马逊、eBay 和谷歌)为其网络服务提供基于 REST 和 SOAP 的接口。
##### 2.1 SOAP 与 REST 的比较
| 比较项 | SOAP | REST |
| ---- | ---- | ---- |
| 数据结构 | 将数据放入特定的 XML 结构(SOAP 文档)中 | 输入值可以通过 URL 作为查询字符串参数提供,或作为消息体中的名值对组合提供 |
| 复杂性 | 可能比较冗长,在没有内置 SOAP 支持的平台上构造 SOAP 消息更困难 | 开销较小,但没有真正的类型检查 |
| 优势 | 使用强类型数据,由于 SOAP 头(可随消息传递但不放在消息体中的单独信息)具有高度可扩展性 | 不同的 HTTP 动词代表对对象的操作 |
##### 2.2 构建简单网络服务
可以使用 ASP.NET 构建简单网络服务,但需要避免完整的 Web 表单模型,而是创建一个 HTTP 处理程序。以下是创建 HTTP 处理程序的步骤:
1. 在解决方案资源管理器中右键单击 ASP.NET 网站,选择“Add New Item”。
2. 选择“Generic Handler”模板,提供一个名称,然后点击“Add”。默认情况下,HTTP 处理程序的扩展名为 `.ashx`,例如 `PopulationService.ashx`。
以下是 `PopulationService.ashx` 的代码示例:
```csharp
public class PopulationService : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
// Get the posted year.
string year
```
0
0
复制全文
相关推荐





