Silverlight 应用程序常常需要访问后端服务器上的某些数据或功能。例如,如果您正在写入客户管理应用程序,该服务器可能包含您的 Silverlight 应用程序需要检索的客户数据库。如果您正在写入游戏,该服务器可能包含您的 Silverlight 应用程序需要更新的高分数信息。在很多情况下,让 Silverlight 能够使用服务器上的功能的最好方法是创建 Web 服务
将启用 Silverlight 的 WCF 服务添加到现有网站或 Web 应用程序
-
从"文件"菜单中依次选择"新建"、"项目",然后从"项目类型"中选择 Silverlight,再从"安装了 Visual Studio 的模板"中选择"Silverlight 应用程序"。接受默认"名称"SilverlightApplicaton1,然后单击"确定"。
-
在弹出的"新建 Silverlight 应用程序"向导中,接受已选中的默认选项"在新网站中承载 Silverlight 应用程序"。接受"新建 Web 项目名称"的默认值 SilverlightApplication1.Web,并接受默认的"ASP.NET Web 应用程序项目"作为"新建 Web 项目类型"。然后单击"确定"。
-
若要将启用 Silverlight 的 Windows Communication Foundation (WCF) 服务添加到生成的默认 Web 应用程序中,请右击"解决方案资源管理器"中的 SilverlightApplication1.Web 项目,并选择"添加",然后选择"新建项"打开"添加新项"窗口。在左侧的"已安装的模板"窗格中,从相关语言组(Visual C# 或 Visual Basic)中选择"Silverlight",然后从中央窗格中选择"启用了 Silverlight 的 WCF 服务"模板。在底部附近的"名称"框中将服务名称更改为 CustomerService.svc,然后单击该框右侧的"添加"按钮。
-
若要定义和实现
CustomerService
协定,请使用希望服务支持的操作替换CustomerService
类中的DoWork
方法(已在 CustomerService.svc.cs 文件中定义)。在此示例中,我们将添加两项操作以支持 Silverlight 客户端检索数据库中的用户数量以及每个用户的信息。 -
服务中使用的类型需要遵守称为数据协定的特定规则。创建有效类型的最简单方法是确保它是公用的,具有公共成员,并且具有不需要任何参数的公共构造函数。全部公开即隐式定义了此类型的数据协定。例如,可以按如下方式实现
GetUser
操作中的User
类型(在 SilverlightApplication1.Web 命名空间中,CustomerService
类后面)。 -
若要在 Visual Studio 中测试服务实现,请选择"解决方案资源管理器"中的 CustomerService.svc 文件,然后右击并选择"在浏览器中查看"(或按 Ctrl + F5)以显示服务的测试页。您应看到"CustomerService 服务"测试页,这样便可确定该服务可用。
示例
以下示例总结了完成以上过程后 CustomerService.svc.cs 文件中的代码。
//CustomerService.svc.cs
using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
namespace SilverlightApplication1.Web
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CustomerService
{
[OperationContract]
public int CountUsers()
{
return 2;
}
[OperationContract]
public User GetUser(int id)
{
if (id == 1)
{
return new User() { IsMember = true, Name = "Paul", Age = 24 };
}
else
{
return new User() { IsMember = false, Name = "John", Age = 64 };
}
}
}
// All public read/write properties and fields of a type are serialized by default.
public class User
{
public bool IsMember { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}