在Silverligh中访问Web服务 - 从 Silverlight 访问服务

代理是帮助您访问特定服务的类。可以使用 Visual Studio 2010 中的"添加服务引用"工具自动生成该代理;或者,可以使用从目标服务收到的服务元数据文档借助 Silverlight 服务模型代理生成工具 (SLsvcutil.exe) 生成该代理

添加对服务的服务引用

  1. 右键单击"解决方案资源管理器"中的 SilverlightApplication1 项目,然后选择"添加服务引用"

  2. 单击"发现"找到在如何:为 Silverlight 客户端生成服务过程中创建的 CustomerService.svc。它应该出现在"服务"框中。

    接受"命名空间"字段中的 ServiceReference1 并单击"确定"

  3. 请注意,现在"解决方案资源管理器"中已经添加了一个名为"服务引用"的文件夹。通过右键单击并选择"在对象浏览器中查看",可以在该文件夹中找到 ServiceReference1。请注意,它包含了 SilverlightApplication1.ServiceReference1.CustomerServiceClient 类及其方法。这些方法用于调用服务。

构造服务的代理

  1. 转到客户端应用程序中的 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;
}
}
}
}

posted @ 2011-03-22 22:21  南宫元耘  阅读(880)  评论(0编辑  收藏  举报