65.9K
CodeProject 正在变化。 阅读更多。
Home

开始使用 WCF

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.21/5 (9投票s)

2009年3月9日

CPOL

9分钟阅读

viewsIcon

104910

一个非常快速简单的 WCF 使用入门。

引言

WCF 很好,也许很棒。它解决了我们从未意识到存在的大量问题,并带来了更多全新的、激动人心的问题。如果您使用 Web 服务、.NET Remoting 或任何其他用于让一个程序与另一个程序(或应用程序层、服务器、进程等)通信的奇怪方案,那么 WCF 就是为您准备的。

它功能强大,非常灵活。不幸的是,这也意味着要找到关于它如何工作的简单答案非常困难。我将尽可能快速、简单地向您展示如何在常见且有用的场景下开始使用 WCF。但请注意,我只演示了一种使用 WCF 的快速教程;我并没有展示 WCF 的所有工作方式。

要快速解决您可能遇到的更多常见难题,并逐节阅读我正在撰写和修订的下一篇 WCF 文章,请访问 www.slickit.ca。您还可以直接在那里找到联系我的方式,以防您需要一些个人协助。

构建一个基本的 WCF 服务

WCF 的核心思想是服务。服务本质上是一个类,您可以从该类所在的应用程序外部访问它,甚至可以跨越互联网访问。让我们来看一个简单的 WCF 服务

Imports System.ServiceModel 

<ServiceContract()> _
Public Class Test 

    <OperationContract()> _
    Public Function GetLocalTime(ByVal includeDate As Boolean) As String 

        If includeDate Then
            Return Now.ToString
        Else
            Return Now.TimeOfDay.ToString
        End If 

    End Function 

End Class

正如您所见,它实际上只是一个普通的类。<ServiceContract()> 标记该类为 WCF 服务,而 <OperationContract()> 标记该函数为服务的操作,以便您可以从其应用程序外部访问它。在许多示例中,您会看到该类被拆分为一个接口(契约)和一个类(服务)。这可能是一个好主意,但并非必需。

如果该代码无法编译,您可能需要添加对 System.ServiceModel 的引用。

信不信由你,就这样。您已经创建了一个服务。简单!

在 IIS 中托管一个基本的 WCF 服务

好的,您已经创建了一个很棒的 WCF 服务。它可以报时等等!但您如何使用它呢?嗯,事情开始变得有点复杂了。

有许多方法可以托管此服务,也有许多方法可以供客户端访问。您可以将服务托管在独立的应用程序中,或者托管在您自己编写的 Windows 服务中。您可以使用称为 Windows Process Activation Service 的服务。或者,您可以使用传统的 IIS。使用 IIS 有一些好处:您可以利用 IIS 的所有功能和配置,即使不了解 WCF 的人也能轻松理解正在发生的事情,而且其他应用程序(即使不是用 .NET 构建的)也很容易使用该服务。

您还需要选择一个绑定。绑定本质上是一种通信方式,有许多选择。您可以选择 HTTP(有多种口味)、TCP、命名管道、MSMQ 等等。我们将查看 basicHttpBinding,它很好用,简单且兼容性强。

因此,如果我们在 IIS 中托管,我们显然需要一个虚拟应用程序文件夹来运行我们的服务。让我们称之为 web WCFTest。然后,使用 IIS 管理器允许匿名身份验证,以便暂时不必担心安全问题。

我们需要向 web 添加三个文件。首先,我们需要包含您编写的服务所在的程序集。我假设您创建了刚才向您展示的服务,并将其放在了一个名为 WCFTest 的类库(DLL 项目)中。编译该项目时,您会生成一个名为 WCFTest.dll 的文件。在您的 web 中创建一个名为“bin”的文件夹,并将此文件复制到那里。

其次,我们需要向 web 添加一个 *.svc 文件。此文件代表客户端用于访问服务的地址,并告诉 IIS 在哪里可以找到要使用的服务。让我们将此文件命名为 Test.svc。它需要包含以下内容

<%@ ServiceHost Service="WCFTest.Test" %>

ServiceHost 告诉服务器此 URL 代表一个 WCF 服务。Service="WCFTest.Test" 告诉服务器使用哪个类来运行服务。由于我们将 *.dll 文件放在了 /bin 文件夹中,服务器将自动找到该类并能够使用它。还有其他组织方式,但这可能是最容易理解的。

最后,我们需要一个 web.config 文件放在 web 的根目录下,以告诉服务器如何配置服务。您需要以下内容:

<?xml version="1.0"?> 
<configuration> 
  <system.serviceModel> 
    <services> 
      <service  name="WCFTest.Test"> 
        <endpoint address="" binding="basicHttpBinding" contract="WCFTest.Test" /> 
      </service> 
    </services> 
  </system.serviceModel> 
</configuration>

您可以看到我们配置了一个名为 WCFTest.Test 的服务,并使用 basicHttpBinding 创建了一个端点。您可以看到,对于契约,我们使用的是与服务本身相同的类,但如果您愿意,可以将服务契约(作为接口)定义在一个程序集中,然后在另一个类或程序集中实现服务本身(作为实现您的接口的类)。

现在,当您浏览到 https:///WCFTest/Test.svc 时,您会看到一个声明您已访问 WCF 服务的网页。页面的其余部分讨论了元数据。现在,您的服务已启动并正在运行。如果您有任何客户端正在使用该服务,它们应该能够正常工作。

但是,您还没有任何客户端在使用此服务。没有元数据,您会发现构建一个客户端很难。元数据告诉其他程序您的服务如何工作以及如何使用它。一旦它们知道了这一点,它们就不再需要元数据了,但要达到这一点,我们将通过 IIS 公开元数据。为此,我们将更改 web.config 文件以添加另一个端点。此端点将使用 mexHttpBinding,这是一种元数据交换格式。我们将地址设置为 /mex,我们还将定义并设置 serviceBehavior,它允许您指定有关服务如何工作的更详细选项。以下是您的新 web.config 文件应有的样子

<?xml version="1.0"?> 
<configuration> 
  <system.serviceModel> 
    <services> 
      <service behaviorConfiguration="basicBehavior" name="WCFTest.Test"> 
        <endpoint address="" binding="basicHttpBinding" contract="WCFTest.Test" /> 
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 
    </services> 
    <behaviors> 
      <serviceBehaviors> 
        <behavior name="basicBehavior"> 
          <serviceMetadata httpGetEnabled="true" /> 
        </behavior> 
      </serviceBehaviors> 
    </behaviors> 
  </system.serviceModel> 
</configuration>

现在,关于您的 WCF 服务的元数据可在 https:///WCFTest/Test.svc/mex 处获得。但是,您无法使用 Internet Explorer 浏览它;它不是为 Web 浏览器使用的。不过,您可以访问 https:///WCFTest/Test.svc?wsdl 来查看您的元数据的 XML 版本。

至此,您的服务已在 IIS 中启动并运行,并且您的服务元数据可用,因此其他程序将知道如何访问和使用它。

WCF:调用一个基本的 WCF 服务

因此,您已经构建了一个 WCF 服务并将其托管在 IIS 中。现在您想访问此服务。如何操作?嗯,我们又回到了简单的情况!

使用 Visual Studio 2008,只需转到“项目”、“添加服务引用”。键入您构建的服务的 URL,然后选择新引用的名称。单击“确定”后,您将能够像使用项目中的类一样使用您的服务。

Dim wcfTest As New svcTest.TestClient
Dim sTime As String = wcfTest.GetLocalTime(True)

如果您仍在使用 .NET 2.0,您也可以添加 Web 服务引用,并像使用传统 ASP.NET Web 服务一样使用您的 WCF 服务,使用生成的 ?wsdl 元数据。

故障排除

如果您在此教程中遇到了任何问题,以下是一些可能导致您遇到麻烦的事情。

不同版本

如果您知道自己在做什么,WCF 在许多配置下都得到支持。但是,当您刚开始时,您希望一切都尽可能简单。您将获得最好的体验使用以下版本

  • .NET Framework 3.5 SP1
  • Visual Studio 2008(避免 Express 版本)
  • IIS7(Windows Vista、Windows Server 2008、Windows Seven 或 Windows Server 2008 R2)

配置文件

编辑配置文件可能是本教程中最困难的部分。花时间仔细检查所有 XML,以便您了解每个节点的作用。即使错误看起来很晦涩,它可能至少会指向需要修复的配置部分。

区分大小写

这给所有 VB 开发者。请注意:这些配置文件区分大小写!

安全错误

您可能不需要这样做,但这通常有助于以管理员身份运行 VS2008,以帮助排除任何与安全相关的问题。

集成身份验证

如果您启用了集成身份验证,您可能会收到此错误

此服务的安全设置需要“匿名”身份验证,但未为此服务宿主所在的 IIS 应用程序启用它。

如果是这样,您将不得不调整配置文件以匹配您的 IIS 配置。有关更多信息,请参阅我发布的题为 使用 IIS 和 Windows 身份验证保护 WCF 服务 的文章,该文章发布在 Slick IT 上。

更多资源

希望您现在至少对如何在 WCF 中启动一个非常简单的示例有了基本的了解。如果您通过实验学习,您应该能够顺利进行。但是,如果您想在独立工作之前多阅读一些关于 WCF 的内容,这里有一些您可能找不到的有用页面

  • MSDN 对 WCF 的介绍。这应该是您的第一个参考点。入门教程对于初学者来说有点冗长和复杂,但对于那些想学习 WCF 的“微软方式”的人来说,阅读起来非常有益。强烈推荐。
  • Nikola Dudar 的博客。在这里,您会找到与本文类似的方法。本教程基于 C#,更侧重于 VS2008 工具和功能,这些工具和功能可以帮助您编写 WCF 服务。它还介绍了 WCF 服务宿主,这是一个非常有用的实用工具。
  • 如果它坏了,你就应该修复它。这是一个基于 C# 的介绍,对代码方面进行了更深入的探讨。
  • Kirk Evan 的博客。这里有一个动态调用 WCF 服务的技巧,如果您在运行时才能获得所调用服务的元数据,这将非常有帮助。
  • J.D. Meier 的博客。此博客提供了大量的文章和视频,可帮助您解决各种与安全相关的难题。
  • 关于互操作性的一切。这个网站提供了丰富的 WCF 相关信息。您会找到很多关于通过 WCF 连接您的应用程序与其他人连接的细节,以及一些很棒的屏幕录像和指南。

结论

正如您所见,WCF 服务非常容易构建和使用。配置它们需要一些学习,但 WCF 的优势在于您可以在一个地方编写服务,在另一个地方使用该服务,像一切都发生在同一个程序中一样编写代码,然后使用配置文件根据需要将它们连接起来。

是的,它是新的,并且需要认真学习才能完全理解。不,它并不完美。但它确实是朝正确方向迈出的一大步。如果您能在下一个项目中使用 .NET 3.5,您真的应该尝试一下 WCF。

历史

  • 2009 年 3 月 9 日:初始发布
© . All rights reserved.