实现一个基本的 Hello World WCF 服务
通过清晰的说明和精确的屏幕截图,从零开始逐步手动实现一个基本的 WCF 服务。
更新
本文的 .NET 4.5 更新版本可在 实现一个基本的“Hello World”WCF 服务 (v4.5) 找到
引言
这是我第一篇关于 WCF/LINQ 的文章。在前三篇 CodeProject.com 的文章中,我将解释 Windows Communication Foundation (WCF) 的基础知识,包括
在其他文章中,我将解释 LINQ、LINQ to SQL、Entity Framework 和 LINQ to Entities。以下是我撰写的关于 LINQ、LINQ to SQL 和 LINQ to Entities 的文章
概述
在本文中,我们将通过清晰的说明和精确的屏幕截图,从零开始逐步手动实现一个基本的 WCF 服务。阅读本文后,您将对 WCF 的内部机制有一个透彻的理解。本文中所有的屏幕截图都将使用 Windows 7 下的 Visual Studio 2010。
我们将从零开始手动构建 WCF 服务,这意味着我们不会使用任何 Visual Studio 2010 模板来创建服务。我们还将手动创建主机应用程序和测试客户端应用程序,包括使用 svcutils.exe 工具手动生成代理和配置文件。在您的实际项目中,您可以而且应该利用 Visual Studio 2010 来帮助完成这些任务,但手动完成实际工作是让您了解 WCF 内部真正工作原理的好方法。这将有助于您更好地理解 Visual Studio 中这些 WCF 模板的“为什么”。
我们将通过以下步骤构建一个“Hello World”WCF 服务
- 创建解决方案和项目
- 创建 WCF 服务契约接口
- 实现 WCF 服务
- 在 ASP.NET 开发服务器中托管 WCF 服务
- 创建一个客户端应用程序来使用此 WCF 服务
创建 HelloWorld 解决方案和项目
在构建 WCF 服务之前,我们需要为服务项目创建一个解决方案。我们还需要一个目录来保存所有文件。在本文中,我们将把项目源代码保存在 C:\SOAwithWCFandLINQ\Projects 目录中。我们为创建的每个解决方案创建一个子文件夹,并且在该解决方案文件夹下,为每个项目创建一个子文件夹。
对于这个 HelloWorld 解决方案,最终的目录结构如下图所示
注意:您不需要通过 Windows 资源管理器手动创建这些目录;当您创建解决方案和项目时,Visual Studio 会自动创建它们。
现在,按照以下步骤创建我们的第一个解决方案和 HelloWorld 项目
您可能已经注意到,Visual Studio 2010 中已经有了一个 WCF 服务应用程序模板。对于这个第一个示例,我们不会使用此模板。相反,我们将自己创建所有内容,以便您了解每个模板的用途。这是您理解和掌握这项新技术的绝佳方法。
- 启动 Visual Studio 2010。如果弹出“打开项目”对话框,单击“取消”将其关闭。
- 转到菜单“文件 | 新建 | 项目”。将出现“新建项目”对话框窗口。
- 从窗口左侧(“已安装的模板”)展开“其他项目类型”,然后选择“Visual Studio 解决方案”作为模板。从窗口中间选择“空解决方案”。
- 在窗口底部,键入 HelloWorld 作为“名称”,并键入 C:\SOAwithWCFandLINQ\Projects\ 作为“位置”。请注意,您不应在位置中输入 HelloWorld,因为 Visual Studio 会自动为新解决方案创建一个文件夹。
- 单击“确定”按钮关闭此窗口,您的屏幕应如下图所示,其中包含一个空解决方案。
- 根据您的设置,布局可能有所不同。但您的“解决方案资源管理器”中仍应有一个空解决方案。如果您看不到“解决方案资源管理器”,请转到菜单“视图 | 解决方案资源管理器”,或按 Ctrl+Alt+L 调出它。
- 在“解决方案资源管理器”中,右键单击解决方案,然后从上下文菜单中选择“添加 | 新建项目...”。您也可以转到菜单“文件 | 添加 | 新建项目...”以获得相同的结果。下图显示了添加新项目的上下文菜单
- “添加新项目”窗口现在应该出现在您的屏幕上。在该窗口的左侧(“已安装的模板”)中,选择“Visual C#”作为模板,在该窗口的中间,选择“类库”。
- 在窗口底部,键入 HelloWorldService 作为“名称”。保留 C:\SOAwithWCFandLINQ\Projects\HelloWorld 作为“位置”。同样,不要将 HelloWorldService 添加到位置中,因为 Visual Studio 会为此新项目创建一个子文件夹(Visual Studio 将使用解决方案文件夹作为添加到解决方案中的所有新项目的默认基本文件夹)。
- 现在,您可以单击“确定”按钮关闭此窗口。
单击“确定”按钮后,Visual Studio 将为您创建多个文件。第一个文件是项目文件。这是一个项目目录下的 XML 文件,名为 HelloWorldService.csproj。
Visual Studio 还会创建一个名为 Class1.cs 的空类文件。稍后,我们将把这个默认名称更改为更有意义的名称,并将其命名空间更改为我们自己的命名空间。
在项目文件夹下会自动创建三个目录:一个用于存放二进制文件,一个用于存放对象文件,另一个用于存放项目属性文件。
您的屏幕上的窗口现在应该如下图所示
我们现在已经创建了一个新的解决方案和项目。接下来,我们将开发和构建这个服务。但在我们进一步操作之前,我们需要对这个项目做两件事
- 单击“解决方案资源管理器”工具栏上的“显示所有文件”按钮。它是从左数第二个按钮,在“解决方案资源管理器”内的“解决方案”字样正上方。如果您将鼠标悬停在此按钮上方,您将看到提示“显示所有文件”,如上图所示。单击此按钮将显示项目文件夹下硬盘上的所有文件和目录——即使那些未包含在项目中的项也会显示。请确保您没有选中解决方案项。否则,您将看不到“显示所有文件”按钮。
- 更改项目的默认命名空间。在“解决方案资源管理器”中,右键单击 HelloWorldService 项目,从上下文菜单中选择“属性”,或者转到菜单项“项目 | HelloWorldService 属性...”。您将看到项目属性对话框窗口。在“应用程序”选项卡上,将“默认命名空间”更改为
MyWCFServices
。
最后,为了开发 WCF 服务,我们需要添加对 System.ServiceModel
命名空间的引用。
现在,在“解决方案资源管理器”中,如果您展开 HelloWorldService 项目的引用,您将看到 System.ServiceModel
已被添加。另请注意,System.Xml.Linq
默认已添加。我们稍后在查询数据库时将使用它。
- 在“解决方案资源管理器”窗口中,右键单击 HelloWorldService 项目,然后从上下文菜单中选择“添加引用...”。您也可以转到菜单项“项目 | 添加引用...”来执行此操作。“添加引用”对话框窗口应该会出现在您的屏幕上。
- 从“.NET”选项卡中选择 System.ServiceModel,然后单击“确定”。
创建 HelloWorldService 服务契约接口
在上一节中,我们为 HelloWorld WCF 服务创建了解决方案和项目。从本节开始,我们将开始构建 HelloWorld WCF 服务。首先,我们需要创建服务契约接口。
- 在“解决方案资源管理器”中,右键单击 HelloWorldService 项目,然后从上下文菜单中选择“添加 | 新建项...”。以下“添加新项 - HelloWorldService”对话框窗口应该会出现在您的屏幕上
- 在窗口左侧(“已安装的模板”)中,选择“Visual C# 项”作为模板,在窗口中间选择“接口”。
- 在窗口底部,将名称从 Interface1.cs 更改为 IHelloWorldService.cs。
- 点击“添加”按钮。
现在,一个空的服务接口文件已添加到项目中。按照以下步骤对其进行自定义
using System.ServiceModel;
[ServiceContract]
[OperationContract]
String GetMessage(String name);
- 添加一个
using
语句 - 向接口添加
ServiceContract
属性。这将把该接口指定为 WCF 服务契约接口。 - 向接口添加
GetMessage
方法。此方法将字符串作为输入,并返回另一个字符串作为结果。它还具有一个属性OperationContract
。 - 将接口更改为
public
。
文件 IHelloWorldService.cs 的最终内容应如下所示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace MyWCFServices
{
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
String GetMessage(String name);
}
}
实现 HelloWorldService 服务契约
现在我们已经定义了服务契约接口,我们需要实现它。为此,我们将重新使用 Visual Studio 之前为我们创建的空类文件,并对其进行修改,使其成为我们服务的实现类。
在修改此文件之前,我们需要对其进行重命名。在“解决方案资源管理器”窗口中,右键单击文件 Class1.cs,从上下文菜单中选择“重命名”,并将其重命名为 HelloWorldService.cs。
注意:Visual Studio 足够智能,可以更改所有相关文件和引用以使用此新名称。您也可以选择文件并从“属性”窗口中更改其名称。
接下来,按照以下步骤自定义此类文件。
public class HelloWorldService: IHelloWorldService
public String GetMessage(String name)
{
return "Hello world from " + name + "!";
}
- 将其命名空间从
HelloWorldService
更改为MyWCFServices
。这是因为此文件是在我们更改项目的默认命名空间之前添加的。 - 使其继承自接口
IHelloWorldService
。 - 向类添加
GetMessage
方法。这是一个普通的 C# 方法,返回一个字符串。
文件 HelloWorldService.cs 的最终内容应如下所示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyWCFServices
{
public class HelloWorldService: IHelloWorldService
{
public String GetMessage(String name)
{
return "Hello world from " + name + "!";
}
}
}
现在,构建项目。如果没有构建错误,则表示您已成功创建了第一个 WCF 服务。如果您看到编译错误,例如“‘ServiceModel’不存在于命名空间‘System’中”,这可能是因为您没有正确添加 System.ServiceModel
命名空间引用。重新访问上一节添加此引用,一切就绪。
接下来,我们将把这个 WCF 服务托管在一个环境中,并创建一个客户端应用程序来使用它。
在 ASP.NET 开发服务器中托管 WCF 服务
HelloWorldService 是一个类库。它必须托管在一个环境中,以便客户端应用程序可以访问它。在本节中,我们将解释如何使用 ASP.NET 开发服务器来托管它。稍后,在下一节中,我们将讨论更多 WCF 服务的托管选项。
创建主机应用程序
Visual Studio 2010 中有几个内置的 WCF 服务主机应用程序。然而,在本节中,我们将手动创建主机应用程序,以便您能够更好地了解主机应用程序的内部机制。在后续章节中,我们将解释和使用内置的主机应用程序。
要使用 ASP.NET 开发服务器托管该库,我们需要向解决方案添加一个新的网站。按照以下步骤创建此网站
- 在“解决方案资源管理器”中,右键单击解决方案文件,然后从上下文菜单中选择“添加 | 新建网站...”。“添加新网站”对话框窗口应该会弹出。
- 选择“Visual C# | 空网站”作为模板,并将“位置”设置为“文件系统”。将网站名称从 WebSite1 更改为 C:\SOAwithWCFandLINQ\Projects\HelloWorld\HostDevServer,然后单击“确定”。
- 现在在“解决方案资源管理器”中,您在解决方案中多了一个项目 (HostDevServer)。它将如下所示
- 接下来,我们需要将网站设置为启动项目。在“解决方案资源管理器”中,右键单击网站 C:\...\HostDevServer,然后从上下文菜单中选择“设为启动项目”(或者您可以首先从“解决方案资源管理器”中选择网站,然后选择菜单项“网站 | 设为启动项目”)。网站 C:\...\HostDevServer 应该在“解决方案资源管理器”中突出显示,表示它现在是启动项目。
- 因为我们将从此网站托管 HelloWorldService,所以我们需要向该网站添加 HelloWorldService 引用。在“解决方案资源管理器”中,右键单击网站 C:\...\HostDevServer 并从上下文菜单中选择“添加引用...”。将出现以下“添加引用”对话框
- 在“添加引用”对话框中,单击“项目”选项卡,选择 HelloWorldService 项目,然后单击“确定”。您将看到在 HostDevServer 网站下创建了一个新目录 (bin),并且 HelloWorldService 项目中的两个文件已复制到此新目录中。稍后,当访问此网站时,Web 服务器(ASP.NET 开发服务器或 IIS)将在此 bin 目录中查找可执行代码。
测试主机应用程序
现在我们可以在 ASP.NET 开发服务器中运行网站了。如果您通过按 Ctrl+F5 或选择“调试 | 不调试启动...”菜单来启动网站 HostDevServer,您将在浏览器中看到一个空白网站。因为我们已将此网站设置为启动项目,但尚未设置任何启动页,所以它会列出 HostDevServer 目录中的所有文件和目录(ASP.NET 开发服务器中的网站始终启用目录浏览)。
如果您按 F5(或从菜单中选择“调试 | 开始调试”),您可能会看到一个对话框,提示“未启用调试”(如下图所示)。选择“不调试运行”选项(相当于 Ctrl+F5),然后单击“确定”按钮继续。我们稍后将探讨 WCF 服务的调试选项。在此之前,我们将继续使用 Ctrl+F5 不调试启动网站。
ASP.NET 开发服务器
此时,您的 HostDevServer 网站应该已经启动并运行。该网站实际上正在内置的 ASP.NET 开发服务器中运行。这是 Visual Studio 2005 中引入的一项新功能。此 Web 服务器仅供开发人员使用,其功能类似于 Internet 信息服务 (IIS) 服务器。它也有一些限制;例如,您只能在本地运行 ASP.NET 应用程序。您不能将其用作真正的 IIS 服务器来发布网站。
默认情况下,ASP.NET 开发服务器在每次启动时都会为 Web 服务器使用动态端口。您可以通过网站的“属性”页将其更改为使用静态端口。只需将“使用动态端口”设置更改为 false,然后从 HostDevServer 网站的“属性”窗口中指定一个静态端口,例如 8080。您不能将端口设置为 80,因为 IIS 已经在使用此端口。但是,如果您停止本地 IIS,则可以将 ASP.NET 开发服务器设置为使用端口 80。
注意:即使您将其端口设置为 80,它仍然是本地 Web 服务器。它无法从您的本地 PC 外部访问。
建议您使用静态端口,以便客户端应用程序提前知道连接服务的地址。从现在开始,我们所有示例都将始终使用端口 8080。
当您需要调试或单元测试 Web 项目时,ASP.NET 开发服务器通常从 Visual Studio 内部启动。如果您确实需要从 Visual Studio 外部启动它,可以使用以下格式的命令行语句
start /B WebDev.WebServer [/port:<port number>] /path:<physical path>
[/vpath:<virtual path>]
对于我们的网站,语句应该像这样
start /B webdev.webserver.exe /port:8080
/path:"C:\SOAwithWCFandLINQ\Projects\HelloWorld\HostDevServer"
/vpath:/HostDevServer
webdev.webserver.exe 位于您的 .NET 框架安装目录(C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 或 C:\Program Files\Common Files\Microsoft Shared\DevServer)下,并且它可能被称为不同的名称,例如 webdev.webserver20.exe 或 webdev.webserver40.exe。
向主机应用程序添加 SVC 文件
虽然我们现在可以启动网站,但它只是一个空网站。目前,它并未托管我们的 HelloWorldService。这是因为我们尚未指定此网站应托管哪个服务,或者此网站的入口点。正如 ASMX 文件是而非 WCF Web 服务的入口点一样,如果 WCF 服务托管在 Web 服务器上,则 .svc 文件是 WCF 服务的入口点。我们现在将向我们的网站添加这样一个文件。
在“解决方案资源管理器”中,右键单击网站 C:\...\HostDevServer,然后从上下文菜单中选择“添加新项...”。“添加新项”对话框窗口应该会出现在屏幕上,如下图所示。在此对话框窗口中,选择“文本文件”作为模板,并将名称从 TextFile.txt 更改为 HelloWorldService.svc。
您可能已经注意到列表中有一个模板“WCF 服务”。我们现在不会使用它,因为它会在此网站中为您创建一个新的 WCF 服务(我们稍后将使用此模板)。
在“添加新项”对话框中单击“添加”按钮后,将创建一个空的 svc 文件并将其添加到网站中。现在在此文件中输入以下行
<%@ServiceHost Service="MyWCFServices.HelloWorldService"%>
修改 web.config 文件
最后一步是修改网站的 web.config 文件。打开网站的 web.config 文件并将其更改为如下所示
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="false" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="MyWCFServices.HelloWorldService"
behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="" binding="wsHttpBinding"
contract="MyWCFServices.IHelloWorldService"/>
<endpoint contract="IMetadataExchange"
binding="mexHttpBinding" address="mex"/>
</service>
</services>
</system.serviceModel>
</configuration>
httpGetEnabled
行为至关重要,因为我们希望其他应用程序能够找到此服务的元数据。如果没有元数据,客户端应用程序将无法生成代理,因此将无法使用该服务。
我们为此托管使用 wsHttpBinding
,这意味着它是安全的(消息在传输过程中已加密)并且支持事务(我们将在后面的章节中讨论)。但是,由于这是 WS-* 标准,一些现有应用程序(例如:QA 工具)可能无法使用此服务。在这种情况下,您可以将服务更改为使用 basicHttpBinding
,它在传输消息时使用纯未加密文本,并且向后兼容传统的 ASP.NET Web 服务 (ASMX Web 服务)。
以下是此配置文件中其他元素的简要说明
在我们的示例中,我们只有一个 WCF 服务 HelloWorldService 托管在此网站中。
- Configuration 是文件的根节点。
system.serviceModel
是所有 WCF 服务特定设置的顶级节点。- 在
services
节点中,您可以指定在此网站上托管的 WCF 服务。 - 每个服务元素定义一个 WCF 服务,包括其名称、行为和终结点。
- 已为 HelloWorldService 定义了两个终结点,一个用于服务本身(应用程序终结点),另一个用于元数据交换(基础设施终结点)。
- 在
serviceBehaviors
节点中,您可以定义服务的特定行为。在我们的示例中,我们指定了一种行为,它为服务启用了服务元数据交换。
启动主机应用程序
现在,如果您通过按 Ctrl+F5 启动网站(再次强调,在稍后讨论这些之前,请勿使用 F5 或菜单选项“调试 | 开始调试”),您将看到网页上列出了 HelloWorldService.svc 文件。单击此文件将显示此服务的描述,即如何获取此服务的 WSDL 文件以及如何创建客户端来使用此服务。您应该会看到一个类似于以下的页面。您还可以将此文件设置为起始页文件,以便每次启动此网站时都直接转到此页面。您可以通过在“解决方案资源管理器”中右键单击此文件并从上下文菜单中选择“设置为起始页”来完成此操作。
现在,单击此页面上的 WSDL 链接,您将获得此服务的 WSDL XML 文件。WSDL 文件提供了此服务的所有契约信息。在下一节中,我们将使用此 WSDL 为客户端应用程序生成代理。
关闭浏览器。然后,从 Windows 系统托盘(systray)中,找到标有“ASP.NET Development Server - Port 8080”的小图标(它位于屏幕右下角,时钟旁边),右键单击它,然后选择“停止”以停止服务。
创建客户端以使用 WCF 服务
现在我们已经成功创建并托管了一个 WCF 服务,我们需要一个客户端来使用该服务。我们将创建一个 C# 客户端应用程序来使用 HelloWorldService。
在本节中,我们将创建一个 Windows 控制台应用程序来调用 WCF 服务。
创建客户端应用程序项目
首先,我们需要创建一个控制台应用程序项目并将其添加到解决方案中。按照以下步骤创建控制台应用程序
- 在“解决方案资源管理器”中,右键单击解决方案 HelloWorld,然后从上下文菜单中选择“添加 | 新建项目...”。“添加新项目”对话框窗口应该会出现在屏幕上,如下图所示
- 选择“Visual C# | 控制台应用程序”作为模板;将项目名称从默认值 ConsoleApplication1 更改为 HelloWorldClient,并将位置保留为 C:\SOAwithWCFandLINQ\Projects\HelloWorld。单击“确定”按钮。现在已创建新的客户端项目并将其添加到解决方案中。
生成代理和配置文件
为了使用 WCF 服务,客户端应用程序必须首先获取或生成代理类。
我们还需要一个配置文件来指定服务的绑定、服务地址和契约等内容。
要生成这两个文件,我们可以使用命令行中的 svcutil.exe 工具。您可以按照以下步骤生成这两个文件
- 通过按 Ctrl+F5 或选择菜单选项“调试 | 不调试启动”来启动服务(此时,您的启动项目仍应为 HostDevServer;如果不是,您需要将其设置为启动项目)。现在,您应该会看到 HelloWorldService 服务的介绍窗口,正如我们在上一节中看到的那样。
- 服务启动后,使用以下语法运行命令行 svcutil.exe 工具(SvcUtil.exe 在您的机器上可能位于不同的目录中;例如,在 Windows 7 中,它位于 v7.0A 目录下)
C:\SOAWithWCFandLINQ\Projects\HelloWorld\HelloWorldClient>
"C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin\SvcUtil.exe"
https://:8080/HostDevServer/HelloWorldService.svc?wsdl
/out:HelloWorldServiceRef.cs /config:app.config
您将看到类似于以下屏幕截图所示的输出
现在,已生成两个文件:一个用于代理(HelloWorldServiceRef.cs),另一个用于配置(app.config)。
如果您打开代理文件,您将看到服务接口 (IHelloWorldService
) 在代理类中被模拟,并且创建了一个客户端类 (HelloWorldServiceClient
) 来实现此接口。在此客户端类中,服务操作 (GetMessage
) 的实现只是一个包装器,它将调用委托给操作的实际服务实现。
在配置文件中,您将看到 HelloWorldService 的定义,例如终结点地址、绑定、超时设置和服务安全行为。
自定义客户端应用程序
在运行客户端应用程序之前,我们还有一些工作要做。按照以下步骤完成自定义
- 将生成的两个文件添加到项目中:在“解决方案资源管理器”中,单击“显示所有文件”以显示 HelloWorldClient 文件夹下的所有文件,您将看到这两个文件。但是,它们未包含在项目中。右键单击其中每个文件,然后选择“包含在项目中”,将它们都包含在客户端项目中。您还可以使用菜单“项目 | 添加现有项...”(或上下文菜单“添加 | 现有项...”) 将它们添加到项目中。
- 添加对
System.ServiceModel
命名空间的引用:就像我们为项目 HelloWorldService 所做的那样,我们需要添加对 WCF .NET System.ServiceModel 程序集的引用。在“解决方案资源管理器”中,右键单击 HelloWorldClient 项目,选择“添加引用...”,然后选择 .NET System.ServiceModel。然后,单击“确定”按钮将引用添加到项目中。 - 修改 program.cs 以调用服务:在 program.cs 中,添加以下行以初始化服务客户端对象
HelloWorldServiceClient client = new HelloWorldServiceClient();
然后,我们可以像调用任何其他对象一样调用其方法
Console.WriteLine(client.GetMessage("Mike Liu"));
将您的姓名作为参数传递给
GetMessage
方法,以便它为您打印一条消息。
运行客户端应用程序
我们现在准备运行此客户端程序。
首先,确保 HelloWorldService 已启动。如果您之前已停止它,请立即启动它(您需要将 HostDevServer 设置为启动项目,然后按 Ctrl+F5 在非调试模式下启动它)。
然后,从“解决方案资源管理器”中,右键单击项目 HelloWorldClient,选择“设为启动项目”,然后按 Ctrl+F5 运行它。
您将看到如下图所示的输出
将服务应用程序设置为自动启动
因为我们知道在运行客户端程序之前必须启动服务,所以我们可以对解决方案进行一些更改以实现此任务的自动化;也就是说,在运行客户端程序之前自动启动服务。
为此,在“解决方案资源管理器”中,右键单击解决方案,从上下文菜单中选择“属性”,您将看到“解决方案‘HelloWorld’属性页”对话框。
在此页上,首先选择“多个启动项目”选项按钮。然后,将 C:\...\HostDevServer\ 的操作更改为“不调试启动”。将 HelloWorldClient 更改为相同的操作。
HostDevServer 必须位于 HelloWorldClient 之上。如果不是,请使用箭头将其移到顶部。
要试用它,请先停止服务,然后按 Ctrl+F5。您会注意到 HostDevServer 先启动,然后客户端程序运行而没有错误。
请注意,这仅在 Visual Studio IDE 内部有效。如果您在未首先启动服务的情况下从 Windows 资源管理器启动客户端程序(C:\SOAwithWCFandLINQ\Projects\HelloWorld\ HelloWorldClient\bin\Debug\HelloWorldClient.exe),服务将不会自动启动,并且您将收到错误消息“无法连接到 https://:8080/HostDevServer/HelloWorldService.svc”。
摘要
在本文中,我们实现了一个基本的 WCF 服务,在 ASP.NET 开发服务器中托管它,并创建了一个命令行程序来引用和使用这个基本的 WCF 服务。此时,您应该对 WCF 的内部机制有了透彻的理解。当您使用 Visual Studio WCF 模板或自动化指导包开发 WCF 服务时,您将从中受益。本章涵盖的关键点是
- WCF 服务是一个类库,它定义一个或多个 WCF 服务接口契约
- 所有 WCF 服务项目都引用 System.ServiceModel 程序集
- WCF 服务的实现只是普通的 C# 类
- WCF 服务必须托管在宿主应用程序中
- Visual Studio 2010 有一个内置的 WCF 服务宿主应用程序,称为 ASP.NET 开发服务器
- 客户端应用程序使用代理与 WCF 服务通信
- 配置文件可用于指定 WCF 服务的设置
注意:这是我的新书“WCF 4.0 多层服务开发与 LINQ to Entities”(ISBN 1849681147)的第 2 章。这本新书是一本实践指南,教您如何使用 WCF 和 LINQ to Entities 在 Microsoft 平台上构建 SOA 应用程序。它根据我的前一本书“WCF 多层服务开发与 LINQ”进行了更新,适用于 VS2010。
通过这本新书,您可以通过完成实际示例并将其应用于您的实际任务来学习如何掌握 WCF 和 LINQ to Entities 概念。这是第一本也是唯一一本将 WCF 和 LINQ to Entities 结合在一个多层实际 WCF 服务中的书籍。它非常适合希望学习如何构建可伸缩、强大、易于维护的 WCF 服务的初学者。这本书包含丰富的示例代码、清晰的解释、有趣的示例和实用建议。它是一本真正的 C++ 和 C# 开发人员的实践书籍。
您无需具备任何 WCF 或 LINQ to Entities 经验即可阅读本书。详细的说明和精确的屏幕截图将引导您完成探索 WCF 和 LINQ to Entities 新世界的整个过程。本书与其他 WCF 和 LINQ to Entities 书籍的区别在于,本书侧重于如何操作,而不是为什么要以这种方式操作,因此您不会被大量关于 WCF 和 LINQ to Entities 的信息所淹没。读完本书后,您会为自己以最直接的方式使用 WCF 和 LINQ to Entities 而感到自豪。您可以阅读我的前一本书在亚马逊上的客户评论,了解我帮助他人学习 WCF 和 LINQ 的程度。
您可以从亚马逊或出版社网站购买此书(此书已更新至 .NET 4.5/Visual Studio 2012。您可以从亚马逊或出版社网站http://www.packtpub.com/windows-communication-foundation-4-5-multi-layer-services-development-framework/book购买此书)。
更新
我的书的最新版本(适用于 Visual Studio 2013 / Windows 7 和 8.1)刚刚出版。您可以直接从出版社网站购买,地址如下
或从亚马逊购买,地址如下
http://www.amazon.com/Multi-Layer-Services-Development-Entity-Framework/dp/1784391042