ASP.NETWebServices开发全解析
立即解锁
发布时间: 2025-08-26 01:40:53 阅读量: 16 订阅数: 29 AIGC 

### ASP.NET Web Services 开发全解析
#### 1. 代理类的创建与更新
当添加服务引用时,Visual Studio 会创建一个代理类。这个代理类的命名是在原始 Web 服务类名后加上 “Client”,例如添加对 `TestService` 的引用时,会创建 `TestServiceClient` 代理类。它包含触发 Web 服务调用的方法和接收结果的事件,负责处理创建请求消息、发送 HTTP 请求、获取响应以及通知代码等复杂操作。
若 Web 服务有变更(如新方法或方法参数类型数量的改变),可随时更新服务引用。操作步骤如下:
1. 重新编译 Web 应用程序。
2. 在解决方案资源管理器中右键单击服务引用。
3. 选择“更新服务引用”。
#### 2. 命令行生成代理代码
Silverlight 提供了命令行工具 `slsvcutil.exe` 来完成与 Visual Studio 服务引用功能相同的工作。可在 Visual Studio 命令提示符中轻松运行该工具。例如,使用以下命令为 `TestService` 创建代理代码:
```csharp
slsvcutil http://localhost:4198/ASPWebSite/TestService.svc?WSDL
```
其中,`?WSDL` 是 Web 服务的约定,它告知 ASP.NET 提供描述 Web 服务的 Web 服务描述语言(WSDL)文档。该文档详细说明了 Web 服务的公共接口(方法和参数),但不暴露其代码或内部工作的任何私有细节。使用 `slsvcutil` 的常见原因是将其作为自动化构建过程的一部分来生成代理类代码。若要查看所有可用参数的列表和描述,可直接输入 `slsvcutil` 而不附带任何参数。
#### 3. 调用 Web 服务
使用代理类时,首先要导入为服务引用指定的命名空间。假设使用命名空间 `MyWebServer` 且项目名为 `MySilverlightProject`,则需要以下语句:
```csharp
using MySilverlightProject.MyWebServer;
```
在 Silverlight 中,所有 Web 服务调用必须是异步的。调用方法启动调用(发送请求)后,该方法会立即返回,代码可继续执行其他任务,用户也能继续与应用程序交互。当收到响应时,代理类会触发相应的代理类事件,事件名称形式为 `MethodNameCompleted`,必须处理此事件以处理结果。
以下是调用 `TestService.GetServerTime()` 方法的示例:
```csharp
// 创建代理类
TestServiceClient proxy = new TestServiceClient();
// 为完成事件附加事件处理程序
proxy.GetServerTimeCompleted += new EventHandler<GetServerTimeCompletedEventArgs>(GetServerTimeCompleted);
// 启动 Web 服务调用
proxy.GetServerTimeAsync();
```
要获取结果,需处理完成事件并检查相应的 `EventArgs` 对象。Visual Studio 在生成代理类时,会为每个方法创建不同的 `EventArgs` 类,唯一的区别在于 `Result` 属性,其类型与方法的返回值匹配。例如,`GetServerTime()` 方法对应的 `GetServerTimeCompletedEventArgs` 类通过 `Result` 属性提供一个 `DateTime` 对象。首次访问 `Result` 属性时,需使用异常处理代码,因为若 Web 服务调用失败(如服务器未找到、Web 服务方法返回错误或连接超时),此处会抛出异常。也可检查自定义 `EventArgs` 对象的 `Error` 属性,若 `GetServerTimeCompletedEventArgs.Error` 为 `null`,则处理请求时未发生错误,可安全地从 `Result` 属性获取数据。
以下是读取结果并显示在 `TextBlock` 中的事件处理程序示例:
```csharp
private void GetServerTimeCompleted(object sender, GetServerTimeCompletedEventArgs e)
{
try
{
lblTime.Text = e.Result.ToLongTimeString();
}
catch (Exception err)
{
lblTime.Text = "Error contacting web service";
}
}
```
#### 4. 代理类的超时配置
默认情况下,若代理类在一分钟内未收到响应会放弃。可在进行 Web 服务调用前使用以下代码配置超时时间:
```csharp
proxy.InnerChannel.OperationTimeout = TimeSpan.FromSeconds(30);
```
#### 5. Web 服务异常处理
当 Web 服务方法抛出异常时,不能直接在 Silverlight 代码中捕获。因为 Web 服务基于更广泛通用的标准,旨在允许任何支持 Web 的平台上的应用程序进行交互,不包含与特定技术(如 .NET 异常类)相关的概念。此外,出于安全考虑,Web 服务可被任何支持 Web 的应用程序使用,若返回具体详细的异常信息,会向潜在攻击者暴露过多内部工作细节。
当调用出错的 Web 服务方法时,Web 服务器会返回一个通用的错误消息,使用 HTTP 状态码 500 表示内部错误。由于浏览器的安全限制,即使错误消息中有更多信息,Silverlight 应用程序也因状态码而无法访问。Silverlight 会检测到错误消息并立即抛出无有用信息的 `CommunicationException`。
若要获取更详细的异常信息,可采取以下两个步骤进行调试:
1. 使用专门的 WCF 行为,在将服务器端错误消息发送到客户端之前,将其 HTTP 状态码从 500 更改为 200(HTTP 状态码为 200 时,浏览器对读取响应信息无限制)。
2. 启用 Silverlight 的 Web 服务配置选项,将异常插入错误消息中。
#### 6. Web 服务 URL 配置
添加服务引用时,自动生成的代码包含 Web 服务 URL,因此创建代理类实例时无需指定 URL。但这可能带来问题,因为所有 Web 服务 URL 必须是完全限定的,不允许使用相对路径。若使用 Visual Studio 中的测试 Web 服务器,后续运行应用程序时,若测试 Web 服务器选择了不同的端口号,就会出现问题。同样,将最终应用程序部署到生产 Web 服务器时,也需要更新 URL。
可通过更新服务引用(重新生成所有代理代码)来解决此问题,也有两个更简单的选项:
- **选项一:配置特定端口**
此方法仅适用于将 Web 应用程序创建为 Web 项目的情况。操作步骤如下:
1. 在解决方案资源管理器中双击“属性”项。
2. 选择“Web”选项卡。
3. 在“服务器”部分,选择“特定端口”并输入要使用的端口号(可选择本次测试服务器已使用的端口号)。
然
0
0
复制全文
相关推荐






