实现基本的Hello World WCF服务(v4.5)

介绍

在这篇文章中,我们将从头开始实现一个基本的WCF 4.5服务。我们将通过执行以下步骤来构建HelloWorld WCF服务:

  • 创建解决方案和项目
  • 创建WCF服务契约接口
  • 实现WCF服务
  • 在IIS Express中主持WCF服务
  • 创建一个客户端应用程序来使用此WCF服务

创建HelloWorld解决方案和项目

在我们构建WCF服务之前,我们需要为我们的服务项目创建一个解决方案。我们还需要一个保存所有文件的目录。在本文中,我们将把项目源代码保存在C:\ SOAWithWCFandLINQ \ Projects目录中。我们将为每个解决方案创建一个子文件夹,在此解决方案文件夹下,每个项目都有一个子文件夹。

对于这个HelloWorld解决方案,最终的目录结构如下图所示:

实现基本的Hello World WCF服务(v4.5)

您不需要使用Windows资源管理器手动创建这些目录; Visual Studio将在您创建解决方案和项目时自动创建它们。

现在按照以下步骤创建我们的第一个解决方案和HelloWorld项目:

1.启动Visual Studio 2012(您可以在本文中使用Visual Studio Ultimate,Premium或Professional)。如果打开项目对话框弹出,点击取消关闭它。

2.转到菜单文件| 新| | 项目。新建项目对话框将出现。

实现基本的Hello World WCF服务(v4.5)

3.从窗口的左侧展开Installed(已安装)其他项目类型,然后选择Visual Studio解决方案作为模板。从窗口的中间部分,选择空白解决方案。

4.在窗口的底部,键入HelloWorld作为名称,然后键入  C:\ SOAWithWCFandLINQ \ Projects \  作为位置。请注意,您不应在该位置输入HelloWorld,因为Visual Studio将自动为新解决方案创建一个文件夹。

5.点击确定按钮关闭这个窗口,你的屏幕应该看起来像一个空的解决方案下面的图像。

实现基本的Hello World WCF服务(v4.5)

 

6.根据您的设置,布局可能会有所不同。但是在解决方案资源管理器中仍然应该有一个空的解决方案 如果您没有看到解决方案资源管理器,请转到菜单“查看”| 解决方案资源管理器或按Ctrl + Alt + L将其启动。

7.在解决方案资源管理器中,右键单击解决方案并选择添加| 新建项目...从上下文菜单中。你也可以去菜单File | 添加| 新项目...获得相同的结果。下图显示了添加新项目的上下文菜单。

实现基本的Hello World WCF服务(v4.5)

8.添加| 新建项目窗口现在应该出现在你的屏幕上。在此窗口的左侧,选择已安装| Visual C#作为模板,并在窗口的中间部分选择“类库”。

9.在窗口底部,输入HelloWorldService作为名称。写C:\ SOAWithWCFandLINQ \ Projects \ HelloWorld作为位置。同样,不要将HelloWorldService添加到位置,因为Visual Studio将为此新项目创建一个子文件夹(Visual Studio将使用解决方案文件夹作为添加到解决方案中的所有新项目的默认基础文件夹)。

实现基本的Hello World WCF服务(v4.5)

您可能已经注意到在Visual Studio 2012中已经有一个用于WCF服务应用程序的模板(实际上在Visual Studio中有几个WCF模板)。对于第一个例子,我们不会使用这个模板。相反,我们会自己创造一切来理解每一步的目的。这是您了解和掌握这项新技术的绝佳方式。在我的新书的下一章(详见本文底部),我们将使用这个模板创建项目,所以我们不需要手动输入很多代码。

Visual Studio也会创建一个名为Class1.cs的空类文件。稍后,我们将把这个默认名称改为更有意义的名称,并将其名称空间更改为我们自己的名称空间。

10.现在你可以点击OK按钮来关闭这个窗口。

一旦你点击确定按钮,Visual Studio就会为你创建几个文件。第一个文件是项目文件。这是项目目录下的一个XML文件,它被称为HelloWorldService.csproj。

在项目文件夹下自动创建三个目录 - 一个用于保存二进制文件,另一个用于保存目标文件,第三个用于项目的属性文件。

现在屏幕上的窗口应该如下图所示:

实现基本的Hello World WCF服务(v4.5)

我们现在创建了一个新的解决方案和项目。接下来,我们将开发和建立这项服务。但是在我们走之前,我们需要为这个项目做两件事:

点击Solution Explorer工具栏上的Show All Files按钮,如上图所示。点击此按钮将显示项目文件夹下的硬盘中的所有文件和目录,甚至包括项目中未包含的项目。确保您没有选择解决方案项目。否则,您将看不到“显示所有文件”按钮。

最后,为了开发一个WCF服务,我们需要添加一个对System.ServiceModel程序集的引用。

实现基本的Hello World WCF服务(v4.5)

  1. 在解决方案资源管理器窗口中,右键单击HelloWorldService项目,然后从上下文菜单中选择添加引用...。您也可以转到菜单项Project | 添加参考...执行此操作。参考管理器对话窗口将出现在屏幕上。
  2. 从Assemblies \ Framework选项卡中检查System.ServiceModel,然后单击确定。现在,在解决方案资源管理器中,如果展开HelloWorldService项目的引用,您将看到添加了System.ServiceModel。另外,请注意System.Xml.Linq是默认添加的。稍后我们将在查询数据库时使用它。

创建HelloWorldService服务契约接口

在上一节中,我们为HelloWorld WCF服务创建了解决方案和项目。从这一节开始,我们将开始构建HelloWorld WCF服务。首先,我们需要创建服务合同界面。

实现基本的Hello World WCF服务(v4.5)

  1. 在解决方案资源管理器中,右键单击HelloWorldService项目,然后选择添加| 新建项目...从上下文菜单中。以下添加新项目 - HelloWorldService对话窗口将出现在您的屏幕上。
  2. 在窗口的左侧,选择已安装| 将Visual C#项目作为模板,并从窗口的中间部分选择Interface。
  3. 在窗口的底部,将Interface1.cs中的Name更改为IHelloWorldService.cs。
  4. 点击添加按钮。

现在,一个空的服务接口文件已经添加到项目中,我们将用它作为服务接口。

按照以下步骤进行定制。

using System.ServiceModel;
[ServiceContract]
[OperationContract]
string GetMessage(string name);

该文件的最终内容IHelloWorldService.cs应如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;

namespace HelloWorldService
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string GetMessage(string name);
    }
}
  1. 添加using声明:
  2. 将ServiceContract属性添加到接口。这将指定该接口作为WCF服务契约接口。
  3. 添加一个GetMessage方法到接口。这个方法将把一个字符串作为输入,并返回另一个字符串作为结果。它也有一个属性OperationContract。
  4. 将界面更改为公共。

实现HelloWorldService服务契约

现在我们已经定义了一个服务契约接口,我们需要实现它。为此,我们将重新使用Visual Studio早期为我们创建的空类文件,并对其进行修改,使其成为我们服务的实现类。

在我们修改这个文件之前,我们需要重命名它。在“解决方案资源管理器”窗口中,右键单击文件Class1.cs,从上下文菜单中选择重命名,并将其重命名为HelloWorldService.cs

Visual Studio足够聪明,能够更改所有引用的相关文件以使用这个新名称。您还可以选择文件并从“属性”窗口更改其名称。

接下来,按照下面的步骤自定义这个类文件。

public class HelloWorldService: IHelloWorldService
public string GetMessage(string name)
{
   return "Hello world from " + name + "!";
}
  1. 打开文件HelloWorldService.cs
  2. 从更名Class1HelloWorldService,如果不为你做。
  3. 使其IHelloWorldService隐式实现
  4. GetMessage给类添加一个方法。这是一个返回字符串的普通C#方法。您也可以右键单击界面链接,然后选择实现接口以添加此方法的框架。

文件HelloWorldService.cs的最终内容应如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloWorldService
{
    public class HelloWorldService: IHelloWorldService
    {
        public String GetMessage(string name)
        {
            return "Hello world from " + name + "!";
        }
    }
}

现在,建立这个项目。如果没有生成错误,则表示您已经成功创建了第一个WCF服务。如果在命名空间“System”中看到编译错误,如“ServiceModel”,则这是因为您没有System.ServiceModel正确添加名称空间引用。重温前面的部分来添加这个参考,并且你已经完成了设置。

接下来,我们将在一个环境中托管这个WCF服务,并创建一个客户端应用程序来使用它。

在IIS Express中托管WCF服务

HelloWorldService是一个类库。它必须托管在一个环境中,以便客户端应用程序可以访问它。在本节中,我们将学习如何使用IIS Express进行托管。稍后,在下一章中,我们将讨论更多的WCF服务的托管选项。

创建主机应用程序

在Visual Studio 2012中有几个内置的用于WCF服务的主机应用程序。但是,在本节中,我们将手动创建主机应用程序,以便您可以更好地理解主机应用程序的真实内容。在后面的章节中,我们将学习和使用内置的托管应用程序。

要使用IIS Express托管该库,我们需要在解决方案中添加一个新网站。请按照以下步骤创建此网站:

如果您找不到ASP.NET空白网页模板,请确保您在上一步中选择了新建网站,而不是新建项目。

实现基本的Hello World WCF服务(v4.5)

实现基本的Hello World WCF服务(v4.5)

实现基本的Hello World WCF服务(v4.5)

  1. 在解决方案资源管理器中,右键单击解决方案文件并选择添加| 新建网站...(始终显示解决方案必须在选项|项目和解决方案中启用才能看到解决方案文件)。弹出“添加新的网站”对话窗口。
  2. 选择Visual C#| ASP.NET空网站“作为模板,并将Web位置保留为”文件系统“。将网站名称从WebSite1更改为C:\ SOAWithWCFandLINQ \ Projects \ HelloWorld \ HostDevServer并单击确定。
  3. 现在在解决方案资源管理器中,解决方案中还有一个项目(HostDevServer)。它将如下所示:
  4. 接下来,我们需要将网站设置为启动项目。在解决方案资源管理器中,右键单击网站HostDevServer,从上下文菜单中选择设置为启动项目(或者您可以先从解决方案资源管理器中选择网站,然后选择菜单项网站|设置为启动项目)。应该在解决方案资源管理器中突出显示HostDevServer网站,指出它现在是启动项目。
  5. 因为我们将从这个网站托管HelloWorldService,我们需要添加一个HelloWorldService引用到网站。在解决方案资源管理器中,右键单击网站HostDevServer,然后从上下文菜单中选择添加引用...。应该出现下面的引用管理器对话框:
  6. 在引用管理器对话框中,单击Solutions \ Projects选项卡,检查HelloWorldService项目,然后单击确定。您将看到在HostDevServer网站下创建了一个新的目录(bin),并且HelloWorldService项目中的两个文件已经被复制到这个新的目录中。稍后,访问此网站时,Web服务器(IIS Express)将在此bin目录中查找可执行代码

测试主机应用程序

现在我们可以在IIS Express中运行网站了。如果启动网站HostDevServer,请按Ctrl + F5或选择Debug | 开始不调试...在菜单中,您将在浏览器中看到一个空的网站,并显示错误。

实现基本的Hello World WCF服务(v4.5)

如果按下F5(或从菜单中选择了Debug | Start Debugging),则可能会看到一个对话框,显示Debugging Not Enabled(未启用调试)(如下所示)。选择选项Run without debugging(相当于Ctrl + F5)并单击OK按钮继续。我们将在下一章探讨WCF服务的调试选项。在此之前,我们将继续使用Ctrl + F5来启动网站而不进行调试。

实现基本的Hello World WCF服务(v4.5)

IIS Express

此时,您应该启动并运行HostDevServer站点。这个网站实际上是在IIS Express里面运行的。IIS Express是为开发人员优化的轻量级自包含IIS版本。此Web服务器仅供开发人员使用,具有与Internet信息服务(IIS)服务器类似的功能。它也有一些限制,例如,它只支持HTTP和HTTPS协议。在Visual Studio中创建新网站时,IIS Express将自动为其分配一个端口。您可以在网站的“属性”中找到您网站的端口,如下图所示。

实现基本的Hello World WCF服务(v4.5)

当您需要调试或单元测试Web项目时,IIS Express通常从Visual Studio中启动。如果您确实需要从Visual Studio外部启动它,则可以使用以下格式的命令行语句:

C:\Program Files\IIS Express\iisexpress /path:c:\myapp\ /port:1054 /clr:v4.0

对于我们的网站,声明应该是这样的:

"C:\Program Files\IIS Express\iisexpress"
/path:C:\SOAwithWCFandLINQ\Projects\HelloWorld\HostDevServer /port:1054 /clr:v4.0

IISexpress.exe位于您的程序文件目录下。在x64系统中,它应该在您的程序文件(x86)目录下。

修改web.config文件

虽然我们现在可以启动网站,但它只是一个空的网站。目前,它不托管我们的HelloWorldService。这是因为我们没有指定这个网站应该托管哪个服务,或者这个网站的入口点。

要指定我们的网站将托管哪个服务,我们可以添加一个svc文件到网站。从.NET 4.0开始,我们也可以使用无文件(svc-less)**服务来实现这一点。在本节中,我们将采取无文件的方法来指定服务(请参考我以前的文章,看看如何用一个真正的svc文件)。

现在让我们修改网站web.config文件来托管我们的HelloWorldService WCF服务。打开网站web.config文件,并将其更改为如下所示:

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  <a href="http://go.microsoft.com/fwlink/?LinkId=169433">http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.5"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <serviceHostingEnvironment >
      <serviceActivations>
        <add factory="System.ServiceModel.Activation.ServiceHostFactory" 

         relativeAddress="~/HostDevServer/HelloWorldService.svc" 

         service="HelloWorldService.HelloWorldService"/>
      </serviceActivations>
    </serviceHostingEnvironment>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

请注意,该system.serviceModel节点是我们添加到配置文件的唯一代码。

行为httpGetEnabled是必不可少的,因为我们希望其他应用程序能够通过HTTP定位这个服务的元数据。没有元数据,客户端应用程序将无法生成代理,从而无法使用该服务。

以下是此配置文件中其他元素的简要说明:

  • Configuration 是文件的根节点。
  • system.serviceModel 是所有WCF服务特定设置的*节点。
  • serviceHostingEnvironment 用于指定主机环境。
  • serviceActivations节点是您指定服务名称及其相对地址的位置。此配置元素允许您定义映射到您的WCF服务类型的虚拟服务**设置。这使得可以**不带.svc文件的WAS / IIS中托管的服务
  • serviceBehaviors节点内,您可以为服务定义特定的行为。在我们的例子中,我们已经指定了一个行为,它启用服务的服务元数据交换。

启动主机应用程序

现在,如果通过按Ctrl + F5(不要使用F5或菜单选项Debug | Start Debugging,直到我们稍后讨论它们)来启动网站,那么仍然会看到相同错误的空白网站。但是现在我们在这个网站上有一个服务,所以只要在地址后面添加HostDevServer / HelloWorldService.svc(它应该看起来像http:// localhost:1054 /),你就会得到这个服务的描述, ,如何获得这个服务的wsdl文件,以及如何创建一个客户端来使用这个服务。你应该看到一个类似于下面的页面。

实现基本的Hello World WCF服务(v4.5)

现在,单击此页面上的wsdl链接,您将获得此服务的wsdl xml文件。wsdl文件提供了该服务的所有合同信息。在下一节中,我们将使用这个wsdl为我们的客户端应用程序生成一个代理。

创建一个客户端来使用WCF服务

现在我们已经成功创建并托管了一个WCF服务,我们需要一个客户端来使用这个服务。我们将创建一个C#客户端应用程序来使用HelloWorldService。

在本节中,我们将创建一个Windows控制台应用程序来调用WCF服务。在本书的后面,我们将创建其他类型的应用程序来测试我们的其他WCF服务,例如WinForms应用程序和WPF应用程序。

创建客户端应用程序项目

首先,我们需要创建一个控制台应用程序项目并将其添加到解决方案中。按照以下步骤创建控制台应用程序:

实现基本的Hello World WCF服务(v4.5)

  1. 在解决方案资源管理器中,右键单击解决方案HelloWorld,然后选择添加| 新建项目...从上下文菜单中。应该出现Add New Project对话框,如下所示。
  2. 选择Visual C#| 控制台应用程序作为模板,将项目名称从ConsoleApplication1的缺省值更改为HelloWorldClient,并将位置保留为C:\ SOAWithWCFandLINQ \ Projects \ HelloWorld点击OK按钮。新客户端项目现在已经创建并添加到解决方案中。

生成代理和配置文件

为了使用非RESTful WCF服务,客户端应用程序必须首先获取或生成代理类。

我们还需要一个配置文件来指定诸如服务绑定,服务地址和合同之类的东西。

要生成这两个文件,我们可以使用命令行中的svcutil.exe工具。您可以按照以下步骤来生成这两个文件:

"C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\SvcUtil.exe" 
  http://localhost:1054/HostDevServer/HelloWorldService.svc?wsdl /out:HelloWorldServiceRef.cs /config:app.config

您将看到类似于以下屏幕截图所示的输出:

实现基本的Hello World WCF服务(v4.5)

  1. 按Ctrl + F5或选择菜单选项Debug |启动服务 无需调试即可开始(此时,您的启动项目仍应为HostDevServer;否则,您需要将其设置为启动项目)。
  2. 服务启动后,打开命令行窗口,将目录更改为客户端应用程序文件夹,然后使用以下语法运行命令行svcutil.exe工具(SvcUtil.exe可能位于计算机中的其他目录中;并且你需要用你的服务托管端口替代1054):

这里生成了两个文件:一个用于代理(HelloWorldServiceRef.cs),另一个用于配置(app.config)。

如果打开代理文件,您将看到service(IHelloWorldService的接口在代理类中被模仿,并且HelloWorldServiceClient创建一个客户端类()来实现这个接口。在这个客户类中,服务操作(GetMessage的实现只是一个将调用委托给操作的实际服务实现的包装器。

在配置文件中,您将看到HelloWorldService诸如端点地址,绑定,超时设置以及服务安全行为的定义。

您也可以在运行时动态创建代理,或者通过Channel Factory而不是代理来调用服务。请注意,如果您使用Channel Factory方法,则可能必须与客户端共享您的接口DLL。

在后面的章节中,我们将学习如何通过Visual Studio生成代理和配置文件,当我们添加对WCF服务的引用时(Visual Studio实际上只是调用相同的命令行工具SvcUtil.exe来完成这项工作)。

自定义客户端应用程序

在我们运行客户端应用程序之前,我们还有一些工作要做。按照以下步骤完成定制:

  1. 重新加载app.config文件。如果您以前打开了app.config文件,那么当您切换到Visual Studio 2012时,将会要求您重新加载app.config文件,因为它已被更改。点击“是”重新加载它。
  2. 将代理文件添加到项目。在解决方案资源管理器中,首先选择HelloWorldClient项目,单击显示所有文件以显示所有文件,现在在HelloWorldClient文件夹下您将看到代理文件(HelloWorldServiceRef.cs)。但是,该文件尚未包含在项目中。右键单击它并选择Include In Project将其包含在客户端项目中。您也可以使用菜单项目| 添加现有项目...(或上下文菜单添加|现有项目...)将其添加到项目中。
  3. 添加对System.ServiceModel命名空间的引用就像我们为HelloWorldService项目所做的那样,我们还需要添加对WCF .NET System.ServiceModel程序集的引用。在解决方案资源管理器中,右键单击HelloWorldClient项目,选择添加引用...并检查组件\ Framework \ System.ServiceModel然后点击确定按钮添加项目的引用。
  4. 修改program.cs来调用服务。program.cs中,添加以下行来初始化服务客户端对象:
HelloWorldServiceClient client = new HelloWorldServiceClient();

HelloWorldServiceClient意味着客户机运行时将在文件app.config中使用默认构造函数,因为使用SvcUtil而存在。

然后我们可以像调用其他对象一样调用它的方法:

Console.WriteLine(client.GetMessage("Mike Liu"));

将你的名字作为参数传递给GetMessage方法,以便打印出你的消息。

运行客户端应用程序

我们现在准备运行这个客户端程序。

首先,确保服务主机应用程序HostDevServer已经启动。如果您之前已经停止了它,现在就启动它(您需要将HostDevServer设置为启动项目,然后按Ctrl + F5以非调试模式启动),或者右键单击项目HostDevServer并选择“View in浏览器(Internet Explorer)“)。

然后,从解决方案资源管理器右键单击项目HelloWorldClient,选择设置为启动项目,然后按Ctrl + F5运行它。

你会看到如下图所示的输出:

实现基本的Hello World WCF服务(v4.5)

将服务应用程序设置为AutoStart

因为我们知道我们必须在运行客户端程序之前启动服务主机应用程序,所以我们可以对解决方案进行一些更改来自动执行此任务,即在运行客户端程序之前立即自动启动服务。

为此,在解决方案资源管理器中,右键单击解决方案,从上下文菜单中选择属性,您将看到解决方案'HelloWorld'属性页面对话框。

实现基本的Hello World WCF服务(v4.5)

在此页面上,首先选择选项按钮,多个启动项目。然后将HostDevServer的操作更改为启动而不进行调试。将HelloWorldClient更改为相同的操作。注意HostDevServer必须高于HelloWorldClient。如果不是,请使用箭头将其移至顶部。

现在要测试它,首先停止服务,然后按Ctrl + F5。您会注意到,HostDevServer是首先启动,然后客户端程序运行没有错误。

请注意,这只能在Visual Studio IDE中使用。如果在没有首先启动服务的情况下从Windows资源管理器(C:\ SOAWithWCFandLINQ \ Projects \ HelloWorld \ HelloWorldClient \ bin \ Debug \ HelloWorldClient.exe启动客户端程序,服务将无法自动启动,您将收到错误消息说“ 没有端点在http:// localhost:1054 / HostDevServer / HelloWorldService.svc中侦听 ”。

概要

在本文中,我们已经实现了一个基本的WCF服务,在IIS Express中托管它,并创建了一个命令行程序来引用和使用这个基本的WCF服务。在这一点上,你应该深入了解WCF服务的底层。使用Visual Studio WCF模板或自动化指导软件包开发WCF服务时,您将受益于此。在下一章中,我们将探索更多的托管选项,并讨论如何调试WCF服务。


本篇文章感谢Mike_Liu-QXUN工作室千讯工作室