开始使用 WCF






4.21/5 (9投票s)
一个非常快速简单的 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 日:初始发布