代理是帮助您访问特定服务的类。可以使用 Visual Studio 2010 中的"添加服务引用"工具自动生成该代理;或者,可以使用从目标服务收到的服务元数据文档借助 Silverlight 服务模型代理生成工具 (SLsvcutil.exe) 生成该代理
添加对服务的服务引用
-
右键单击"解决方案资源管理器"中的 SilverlightApplication1 项目,然后选择"添加服务引用"。
-
单击"发现"找到在如何:为 Silverlight 客户端生成服务过程中创建的 CustomerService.svc。它应该出现在"服务"框中。
接受"命名空间"字段中的 ServiceReference1 并单击"确定"。
-
请注意,现在"解决方案资源管理器"中已经添加了一个名为"服务引用"的文件夹。通过右键单击并选择"在对象浏览器中查看",可以在该文件夹中找到 ServiceReference1。请注意,它包含了 SilverlightApplication1.ServiceReference1.CustomerServiceClient 类及其方法。这些方法用于调用服务。
构造服务的代理
-
转到客户端应用程序中的 MainPage.xaml.cs(代码隐藏)文件,并在页面顶部添加以下 using 语句:
using System.ServiceModel; using SilverlightApplication1.ServiceReference1;
2. 在使用服务之前,必须先实例化 Web 服务代理。例如,可以在 MainPage()
构造函数的作用域中执行此操作。
CustomerServiceClient proxy = new CustomerServiceClient();
在 Web 服务上调用操作
1. Silverlight 中的所有 Web 服务调用都是异步的。对于服务中的每个操作,代理都包含两个成员:一个异步方法和一个已完成的事件。例如,考虑CountUsers
服务操作。
我们首先在MainPage()
构造函数的作用域中将EventHandler
添加到CountUsersCompleted
。当服务返回我们请求的数据时,将调用此事件。在设置事件后,我们就可
以通过调用CountUsersAsync
来调用该服务。
2.MainPage()
构造函数作用域内GetUsers
服务操作的异步方法和已完成事件所需的代理成员如下
3. 事件处理程序指定应在该服务返回某些数据时调用proxy_CountUsersCompleted
方法。我们需要以一种能够可靠处理错误的方式在MainPage
类的作用域内定义此方法。
要处理错误情况,您必须在访问 Result 属性前通过检查最终事件参数的 Error 属性检测错误。如果在出现错误情况时尝试访问 Result 属性,将引发异常。示例//MainPage.xaml.cs
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.ServiceModel;
using SilverlightApplication1.ServiceReference1;
namespace SilverlightApplication1
{
public partial class MainPage : UserControl
{
public MainPage()
{
// Required to initialize variables
InitializeComponent();
CustomerServiceClient proxy = new CustomerServiceClient();
proxy.CountUsersCompleted += new EventHandler< CountUsersCompletedEventArgs>(proxy_CountUsersCompleted);
proxy.CountUsersAsync();
proxy.GetUserCompleted += new EventHandler< GetUserCompletedEventArgs>(proxy_GetUserCompleted);
proxy.GetUserAsync(1);
}
void proxy_GetUserCompleted(object sender, GetUserCompletedEventArgs e)
{
if (e.Error != null)
{
getUserResult.Text = "Error getting the user.";
}
else
{
getUserResult.Text = "User name: " + e.Result.Name + ", age: " + e.Result.Age + ", is member: " + e.Result.IsMember;
}
}
void proxy_CountUsersCompleted(object sender, CountUsersCompletedEventArgs e)
{
if (e.Error != null)
{
userCountResult.Text = "Error getting the number of users.";
}
else
{
userCountResult.Text = "Number of users: " + e.Result;
}
}
}
}