Visual Studio 提供了用于使用 Windows Communication Foundation(WCF)和 WCF 数据服务的工具,Microsoft用于创建分布式应用程序的技术。 本文从 Visual Studio 的角度介绍了服务。 有关完整文档,请参阅 WCF Data Services 4.5。
Windows Communication Foundation(WCF)是一个统一的框架,用于创建安全、可靠、事务化和可互作的分布式应用程序。 它取代了较旧的进程间通信技术,如 ASMX Web 服务、.NET 远程处理、企业服务(分布式组件对象模型(DCOM)和Microsoft消息队列(MSMQ)。 WCF 将所有这些技术的功能组合在一个统一的编程模型中。 此方法简化了开发分布式应用程序的体验。
WCF Data Services
WCF 数据服务是开放数据(开放数据协议(OData)协议标准的实现。 WCF 数据服务允许将表格数据公开为一组 REST API,这样就可以使用标准 HTTP 命令(例如GET、POST和PUTDELETE)返回数据。 在服务器端, ASP.NET Web API 取代 WCF 数据服务以创建新的 OData 服务。 WCF Data Services 客户端库始终是通过 Visual Studio 在 .NET 应用程序中使用 OData 服务(Project>Add Service Reference)的理想选择。 有关详细信息,请参阅 WCF Data Services 4.5。
WCF 编程模型
WCF 编程模型基于两个实体之间的通信:WCF 服务和 WCF 客户端。 编程模型封装在 System.ServiceModel .NET 的命名空间中。
WCF 服务
WCF 服务基于定义服务与客户端之间的协定的接口。 该服务使用 ServiceContractAttribute 属性进行标记,如以下代码所示:
定义 WCF 服务公开的函数或方法,方法是使用 OperationContractAttribute 特性标记它们。
还可以通过使用属性标记复合类型 DataContractAttribute 来公开序列化数据,从而在客户端中启用数据绑定。
定义接口及其方法后,它们封装在实现接口的类中。 单个 WCF 服务类可以实现多个服务协定。
WCF 服务通过所谓的 终结点公开供使用。 终结点提供与服务通信的唯一方法。 你无法像访问其他类一样通过直接引用来访问该服务。
终结点由地址、绑定和协定组成。 该地址定义服务所在的位置,例如 URL、文件传输协议 (FTP) 地址或网络或本地路径。 绑定定义与服务通信的方式。 WCF 绑定提供了一种通用模型,用于使用 Windows 身份验证或用户名和密码等安全机制指定协议(如 HTTP 或 FTP)。 协定包括 WCF 服务类公开的操作。
可以为单个 WCF 服务公开多个终结点。 此方法使不同的客户端能够以不同的方式与同一服务通信。 例如,银行服务可以为员工提供一个终结点,另一个终结点用于外部客户,其中每个终结点使用不同的地址、绑定或合同。
WCF 客户端
WCF 客户端由一个 代理 组成,使应用程序能够与 WCF 服务通信,以及与为服务定义的终结点匹配的终结点。 代理在客户端的app.config文件中生成,并包含有关服务公开的类型和方法的信息。 对于公开多个终结点的服务,客户端可以选择最符合其需求的服务,例如,通过 HTTP 进行通信并使用 Windows 身份验证。
创建 WCF 客户端后,可以在代码中引用服务,就像执行任何其他对象一样。 例如,若要调用 GetData 前面所示的方法,请编写类似于以下示例的代码:
private void button1_Click(System.Object sender, System.EventArgs e)
{
ServiceReference1.Service1Client client = new
ServiceReference1.Service1Client();
string returnString;
returnString = client.GetData(textBox1.Text);
label1.Text = returnString;
}
Visual Studio 中的 WCF 工具
Visual Studio 提供了工具来帮助创建 WCF 服务和 WCF 客户端。 有关详细信息,请参阅 演练:在 Windows 窗体中创建简单的 WCF 服务。
创建和测试 WCF 服务
可以使用 WCF Visual Studio 模板作为基础快速创建自己的服务。 然后,可以使用 WCF 服务自动主机和 WCF 测试客户端来调试和测试服务。 这些工具提供快速便捷的调试和测试周期,并消除了在早期阶段提交到托管模型的要求。
WCF 模板
WCF Visual Studio 模板提供用于服务开发的基本类结构。 “ 添加新项目 ”对话框中提供了多个 WCF 模板,包括 WCF 服务库项目、WCF 服务网站和 WCF 服务项模板。
选择模板时,将为服务协定、服务实现和服务配置添加文件。 已添加所有必要的属性,创建简单的“Hello World”服务类型,无需编写任何代码。 可以添加代码来为实际服务提供函数和方法,但模板提供了基本基础。
有关详细信息,请参阅 WCF Visual Studio 模板。
WCF 服务主机
为 WCF 服务项目启动 Visual Studio 调试器(通过选择 F5),WCF 服务主机工具会自动启动本地托管服务。 该工具枚举 WCF 服务项目中的服务,加载项目的配置,并为找到的每个服务实例化主机。
该工具可帮助你测试 WCF 服务,而无需在开发过程中编写额外的代码或提交到特定主机。 有关详细信息,请参阅 WCF 服务主机(WcfSvcHost.exe)。
WCF 测试客户端
使用 WCF 测试客户端工具可以输入测试参数、将输入提交到 WCF 服务,以及查看来自服务的响应。 该工具将它与 WCF 服务主机相结合时提供便捷的服务测试体验。 该工具的位置是 Visual Studio 安装文件夹下的 Common7\IDE 。
选择 F5 调试 WCF 服务项目时,WCF 测试客户端将打开并显示配置文件中定义的服务终结点列表。 可以测试参数并启动服务,并重复此过程以持续测试和验证服务。 有关详细信息,请参阅 WCF 测试客户端(WcfTestClient.exe)。
在 Visual Studio 中访问 WCF 服务
Visual Studio 通过自动生成在 “添加服务引用 ”对话框中添加的服务的代理和终结点,简化了创建 WCF 客户端的任务。 所有必需的配置信息都会添加到 app.config 文件中。 大多数情况下,只需实例化服务以开始使用该服务。
在 “添加服务引用 ”对话框中,指定服务地址或搜索解决方案中定义的服务。 系统返回服务以及服务提供的操作的列表。 还可以定义用于在代码中引用服务的命名空间。
在 “配置服务引用 ”对话框中,自定义服务的配置。 可以更改服务的地址、指定访问级别、异步行为和消息协定类型,以及配置类型重用。
服务终结点
某些 WCF 服务公开多个终结点,客户端可以通过这些终结点与服务进行通信。 服务可能会公开一个终结点,该终结点使用具有用户名和密码安全性的 HTTP 绑定,另一个终结点使用 FTP 和 Windows 身份验证。 应用程序使用第一个终结点从防火墙外部访问服务,而第二个终结点可以在 Intranet 中使用。
在这种情况下,您可以通过服务引用的构造函数来指定 endpointConfigurationName 参数。
注释
本文中的说明说明了 Visual Studio 中提供的交互式开发体验(IDE)的最新版本。 您的计算机可能会显示某些用户界面元素的不同名称或位置。 你可能使用的是不同版本的 Visual Studio 或不同的环境设置。 有关详细信息,请参阅个性化设置 IDE。
选择服务终结点
按照以下步骤选择服务终结点:
通过在 解决方案资源管理器 中右键单击项目节点并选择 “添加服务引用”来添加对 WCF 服务的引用。
在代码编辑器中,添加服务引用的构造函数。 将
ServiceReference替换为服务引用的命名空间,将Service1Client替换为服务的名称。
当你输入代码时,将显示一个包含构造函数重载的 IntelliSense 列表。 选择
endpointConfigurationName As String重载。选择重载后,请在
="<ServiceEndpoint>"处输入您要使用的终结点服务的名称<ServiceEndpoint>。小窍门
可用终结点的名称在 app.config 文件中定义。
查找 WCF 服务的可用终结点
若要查找 WCF 服务的可用终结点,请执行以下步骤:
在 解决方案资源管理器中,右键单击包含服务引用的项目 app.config 文件,然后选择“ 打开”。 文件将在代码编辑器中打开。
搜索文件中的
<Client>标记。在
<Client>标记部分,搜索以<Endpoint>.. 开头的嵌套标记。当服务引用提供多个终结点时,有两个或更多
<Endpoint>个标记。在
<EndPoint>标签定义中,找到name="<ServiceEndpoint>"参数(其中<ServiceEndpoint>表示服务的终结点名称)。 此值是服务终结点的名称,可将其传递给服务引用的构造函数的endpointConfigurationName As String重载。
异步调用服务方法
WCF 服务中的大多数方法都可以同步或异步调用。 异步调用方法时,应用程序可以在调用该方法时继续工作。 当系统通过慢速连接运行时,此方法非常有用。
将服务引用添加到项目时,默认配置是同步调用方法。 可以在 “配置服务引用 ”对话框中异步更改调用方法的行为。
该选项按每项服务设置。 如果服务中的一个方法是异步调用的,则必须异步调用所有的方法。
注释
本文中的说明说明了 Visual Studio 中提供的交互式开发体验(IDE)的最新版本。 您的计算机可能会显示某些用户界面元素的不同名称或位置。 你可能使用的是不同版本的 Visual Studio 或不同的环境设置。 有关详细信息,请参阅个性化设置 IDE。
以异步方式调用方法
若要异步调用服务方法,请执行以下步骤:
在 解决方案资源管理器中,选择服务引用。
选择 “项目>配置服务引用”。
在 “配置服务引用 ”对话框中,选中“ 生成异步作 ”复选框。
绑定服务返回的数据
可以将 WCF 服务返回的数据绑定到控件,就像将任何其他数据源绑定到控件一样。 添加对 WCF 服务的引用时,如果服务包含返回数据的复合类型,它们将自动添加到 “数据源 ”窗口。
将控件绑定到 WCF 服务返回的数据字段
若要将控件绑定到 WCF 服务返回的单个数据字段,请使用以下步骤:
选择 “数据>显示数据源”。 此时会打开 “数据源 ”窗口。
在“数据源”窗口中,展开服务引用的节点。 这会显示服务返回的所有复合类型。
展开类型节点并查看该类型的数据字段。
选择一个字段并展开下拉列表以查看数据类型的可用控件列表。
选择要绑定到的控件的类型。
将字段拖到窗体上。 该控件与BindingSource组件和BindingNavigator组件一起添加到窗体中。
重复步骤 4 到 6 并绑定任何其他字段。
将控件绑定到由 WCF 服务返回的复合类型
若要将控件绑定到 WCF 服务返回的复合类型,请执行以下步骤:
选择 “数据>显示数据源”。 此时会打开 “数据源 ”窗口。
在“数据源”窗口中,展开服务引用的节点。 这会显示服务返回的所有复合类型。
选择一个类型的节点,然后展开下拉列表以查看可用选项的列表。
选择 DataGridView 并查看网格中的数据,或者选择 “详细信息 ”并使用单个控件查看数据。
将节点拖到窗体上。 控件与BindingSource组件和BindingNavigator组件一起添加到窗体中。
配置服务以重用现有类型
将服务引用添加到项目时,会在本地项目中生成服务中定义的任何类型。 在许多情况下,当服务使用通用 .NET 类型或共享库中定义类型时,此方法会创建重复类型。
为了避免此问题,引用程序集中的类型默认是共享的。 如果要禁用一个或多个程序集的类型共享,请更改 “配置服务引用 ”对话框中的设置。
在一个程序集中禁用类型共享
可以按照以下步骤在单个程序集中禁用类型共享:
在 解决方案资源管理器中,选择服务引用。
选择 “项目>配置服务引用”。
在“ 配置服务引用 ”对话框中,选中 指定引用程序集中的“重用类型 ”复选框。
选中要在其中启用类型共享的每个程序集的复选框。 若要禁用程序集的类型共享,请清除该复选框。
在所有程序集中禁用类型共享
你还可以执行以下步骤来在所有程序集中禁用类型共享:
在 解决方案资源管理器中,选择服务引用。
选择 “项目>配置服务引用”。
在 “配置服务引用 ”对话框中,清除 引用程序集中的“重用类型 ”复选框。
探索类似的概念
以下文章介绍与 WCF 服务和 WCF 数据服务相关的概念和过程。
| 标题 | DESCRIPTION |
|---|---|
| 教程:在 Windows 窗体中创建基本 WCF 服务 | 提供在 Visual Studio 中创建和使用 WCF 服务的分步演示。 |
| 演练:使用 WPF 和实体框架创建 WCF 数据服务 | 提供有关如何在 Visual Studio 中创建和使用 WCF 数据服务的分步演示。 |
| 使用 WCF 开发工具 | 介绍如何在 Visual Studio 中创建和测试 WCF 服务。 |
| 如何:添加、更新或删除 WCF 数据服务引用 | 介绍如何使用“添加服务引用”对话框在解决方案中搜索 WCF 数据服务。 |
| 服务引用疑难解答 | 介绍服务引用中可能出现的一些常见错误以及如何防止这些错误。 |
| 调试 WCF 服务 | 介绍调试 WCF 服务时可能会遇到的常见调试问题和技术。 |
| 演练:创建 n 层数据应用程序 | 提供创建类型化数据集并将 TableAdapter 和数据集代码分隔为多个项目的分步说明。 |
| 查看“配置服务引用”对话框 | 描述 “配置服务引用 ”对话框的用户界面元素。 |
相关内容
- 用于 .NET 的 Visual Studio 数据工具
- System.ServiceModel 命名空间
- System.Data.Services 命名空间