TutorialsPoint WCF 教程

来源：易百教程

WCF教程

WCF是Windows通信基础（Windows Communication Foundation）的缩写。 WCF的基本特征是互操作性。这是微软用于构建面向服务的应用程序的最新技术之一。根据基于消息的通信的概念中，一个HTTP请求可以被均匀地表示，WCF是一个统一的API而不管不同的传输机制。

WCF在2006年第一次作为.NET框架以及Windows Vista的一部分发布，然后得到了多次更新。 WCF4.5是当前广泛使用的最新版本。 WCF应用程序由三部分组成 - WCF服务，WCF服务主机和WCF服务客户端。 WCF平台有时也被称为服务模型。

WCF的基本概念

消息 - 这是由几部分组成身外的通信单元。消息实例被作为接收的所有类型的客户端和服务之间的通信。

端点 - 它定义了一个消息将被发送或接收的地址。它还指定的通信机制来描述如何将邮件将被界定的组消息一起发送。一个端点的结构包括以下几个部分组成。

地址 - 该指定要接收的消息的准确位置和被指定为一个统一资源标识符（URI）。它表现为方式：//域名[：端口]/[路径]。这可通过具有上述的地址一目了然很好理解。

net.tcp://localhost:9000/ServiceA

在这里，net.tcp是TCP协议方案。该域名是本地主机，可一机多用的名称或网络域和路径是ServiceA。

绑定 - 它定义了一个端点通信，并包括一些使通信基础设施的结合元件的方式。例如，结合状态用于运输如TCP，HTTP等，消息编码和相关的安全性以及可靠性的协议格式的协议。

合约 - 这是一个范围的操作来指定该消息的端点将通信。它通常是一个接口名称

主机 - 主机相对于WCF通常意味着WCF服务的主机可以通过许多可用的选项，如自托管完成，IIS托管和主持。

元数据 - 这是WCF的一个显著的概念，因为它方便了客户端应用程序和一个WCF服务之间的轻松互动。通常，元数据的WCF服务被启用时，自动生成的，这是由服务和它的端点的检查完成。

WCF客户端 - 被揭露的服务操作的方法形式被称为WCF客户端创建客户端应用程序。这可以由任何应用程序，即使是在一个没有服务的主机托管。

通道 - 通道是通过该客户端可以与服务进行通信的介质。许多不同类型的通道可以得到叠层和被称为信道栈。

SOAP - 虽然名为“简单对象访问协议”，SOAP不是一个传输协议，取而代之的是一个XML文档，其包括头部和主体部。

WCF的优点

1.它是可互操作相对于其他的服务。与此形成鲜明对比.NET远程处理，客户端和服务必须有.NET。

2. WCF服务的提供增强的可靠性和安全性相比，ASMX（活动服务器的方法）web服务。

3.实现安全模型，并结合不断变化的WCF不需要编码的重大变化。只需很少的配置变更，必须符合的约束。

4. WCF具有内置在记录机制，而在其他技术中，必须做必要的编码。

5. WCF集成AJAX和支持JSON（JavaScript对象表示法）。

6.提供可扩展性可支持出新的Web服务标准。

7.具有极其强大的默认安全机制。

WCF与Web服务/Web Service - WCF教程

下面列出了WCF和Web服务之间存在一些重大差异。

属性：WCF服务是通过定义ServiceContract和OperationContract属性，而在Web服务，WebService和WebMethod属性用于定义相同。

协议：WCF支持多种协议，即HTTP，命名管道，TCP和MSMQ；而Web服务仅支持HTTP协议。

托管机制：WCF托管不同的激活机制，即IIS（Internet信息服务），WAS（Windows激活服务），自托管和Windows服务，而Web服务则只能由IIS托管。

服务：WCF支持一个强大的安全，值得信赖的消息传递，事务性和互操作性，而Web服务只支持保障服务。

序列化：WCF支持DataContract串行采用System.Runtime.Serialization，而Web服务通过使用System.Xml.Serialization支持XML序列化。

工具：ServiceMetadata工具（svcutil.exe）用于客户机生成的WCF服务而WSDL.EXE工具用来产生相同web服务。

异常处理：在WCF中，未处理的异常都是在一个更好的方式通过使用FaultContract处理，并没有得到Web服务SOAP（简单对象访问协议）故障返回给客户端等。

有可能要序列哈希Tablein WCF，但这不能在web服务中。

绑定：WCF支持多种类型，如 basicHttpBinding，WSDualHttpBinding，WSHttpBinding等绑定，而Web服务仅支持SOAP或XML。

多线程：WCF支持多线程利用ServiceBehavIor类，而这Web服务不支持。

双工服务操作：WCF支持双工服务业务除了支持单向和请求 - 响应服务操作，而Web服务不支持双工服务操作。

WCF开发工具 - WCF教程

开发一个WCF服务应用程序，主要有两种工具 - Microsoft Visual Studio和Code Plex。Microsoft Visual Studio是一个完整的包所必需的开发了大量的象ASP.NET Web应用，桌面应用，移动应用和许多不同的应用程序的开发工具。 .NET框架的功能，采用的是微软的Visual Studio。Code Plex另一方面是微软的开源项目托管网站，提供一些免费的工具，WCF服务应用程序的开发。

Microsoft Visual Studio

有许多Microsoft Visual Studio版本，最初，它(Visual Studio 2005)不是WCF开发的热情支持者。目前，Visual Studio 2008是唯一的Microsoft IDE提供WCF服务应用程序的开发。如今，微软Visual Studio 2010最新版本，也是开发WCF服务应用程序的首选工具。更重要的是，现在在Visual Studio中没有开发WCF服务应用程序中的现成模板。

选择这样的模板的引出另外用于下列目的的文件 -

服务合约

Service实现

服务配置

微软Visual Studio创建了一个简单的“Hello World”的服务时都会自动添加一些必要的属性，甚至不用编写任何代码。

Code Plex

CodePlex网站是由微软于2006年6月推出，从那时起就一直是由大量世界各地的开发人员用于创建.NET项目而使用。一些由CodePlex上开发WCF服务应用程序所提供的工具以下。

wscf.blue - Microsoft Visual加载项和“协定优先”的开发工具集简化定义WCF服务操作，并相应产生一个代码框架。

对于相同的一个重要环节是 http://wscfblue.codeplex.com/

WCFProxyGenerator - 这也是微软的Visual Studio插件。该工具被用来扩展客户端生成并提供额外的错误处理。对于有关于这个特定的开发工具，更多信息请访问 http://wcfproxygenerator.codeplex.com.

WCFMock - WCF服务的测试是一个复杂的任务，这个开发工具提供了WCF服务通过它的有用的类单元测试的一个方便的解决方案。有关此工具，更多信息请访问 http://wcfmock.codeplex.com/.

另一种WCF服务应用程序开发免费工具是 WCFStorm。它的Lite版本提供了许多显着的特征来动态调用和测试WCF服务，编辑服务绑定，修改WCF URL端点等等。

WCF架构 - WCF教程

WCF是一个分层架构，为开发各种分布式应用的充分支持。该体系结构在下面将详细说明。

约定

约定层旁边就是应用层，并含有类似于现实世界的约定，指定服务和什么样的信息可以访问它会使操作的信息。约定基本都是在简短的讨论如下四种类型。

Service contract - 约定规定，在沟通过程中使用的信息给客户端，以及对终端的产品和协议的外部世界。

Data contract - 由服务交换的数据是由一个数据契约定义。客户端和服务需要在与数据合同协议。

Message Contract - 数据合同由约定信息控制。它主要是SOAP消息的参数类型格式的定制。在此，应该提到的是WCF采用SOAP格式进行通信。 SOAP代表简单对象访问协议。

Policy and Binding - 由策略和有约束力的约定被定义为一个服务，这样的条件下通信的某些先决条件。客户端需要遵循这一约定。

服务运行时

服务运行时层仅仅是约定层之下。它指定在运行时出现的各种服务行为。有许多类型的行为，可以进行配置，如下的服务运行。

Throttling Behavior - 管理处理的消息的数量

Error Behavior – 定义任何内部服务错误发生的结果

Metadata Behavior – 指定的元数据的可用性到外界

Instance Behavior – 定义要创建需要的实例的数量，以使它们可用于在客户端

Transaction Behavior – 能够在事务状态的变化的情况下出现任何故障

Dispatch Behavior - 控制由该消息得到了WCF的基础处理方式

Concurrency Behavior - 控制的客户端 - 服务器通信过程中并行运行功能

Parameter Filtering - 功能参数的方法验证的过程，在它被调用之前

消息

这层几个通道构成主要涉及两个端点之间传送的消息的内容。一组通道的形成通道堆栈和构成的通道堆栈的下面那些渠道的两种主要类型。

Transport Channels - 这些通道都存在于栈底和负责发送和接收使用像HTTP，TCP，P2P，命名管道和MSMQ传输协议的消息。

Protocol Channels - 存在于堆栈的顶部，这些信道也被称为层状通道通过修改消息实现线级协议。

激活和托管

WCF的体系结构的最后一层是其中服务实际上是托管，或者可以以方便客户端被执行的地方。这是通过在下面简要讨论的各种机制进行。

IIS - 互联网信息服务的缩写提供使用HTTP协议通过服务优势很多。这里主机代码的要求不是强制性的，用于激活该服务代码，相反，服务码被自动激活。

Windows激活服务 - 这就是俗称WAS和带有IIS7.0。 HTTP和非HTTP通信，可以在这里通过使用TCP或Namedpipe协议。

Self-Hosting - 这是由一个WCF服务获取自托管的控制台应用程序的机制。这种机制提供了惊人的灵活选择所需的协议和设置自己的解决方案方面。

Windows Service - 主持这一机制的WCF服务是有利的，因为该服务保持激活状态，并接触到客户端，由于没有运行时激活。

创建WCF服务 - WCF教程

使用Microsoft Visual Studio2012创建WCF服务，理解如下所有必要的编码，更好地创建WCF服务的概念，这里做一个简单的任务。

启动Visual Studio 2012。

单击新建项目，然后在Visual C＃标签，选择WCF选项。

WCF服务创建，执行如加法，减法，乘法和除法基本的算术运算。主要的代码是在两个不同的文件 - 一个接口和一个类。

一个WCF中包含一个或多个接口和实现类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfServiceLibrary1
{
   //NOTE: You can use the "Rename" command on the "Refactor" menu to change the
   //interface name "IService1" in both code and config file together.
   [ServiceContract]
   Public interface IService1
   {
      [OperationContract]
      int sum(int num1, int num2);

      [OperationContract]
      int Subtract(int num1, int num2);

      [OperationContract]
      int Multiply(int num1, int num2);

      [OperationContract]
      int Divide(int num1, int num2);
   }

   //Use a data contract as illustrated in the sample below to add composite types
   //to service operations.
   [DataContract]
   Public class CompositeType
   {
      Bool boolValue = true;
      String stringValue = "Hello ";

      [DataMember]
      Public bool BoolValue
      {
         get { return boolValue; }
         set { boolValue = value; }
      }

      [DataMember]

      Public string StringValue
      {
        get { return stringValue; }
        set { stringValue = value; }
      }
   }
}

而其后面是类的代码，

using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Runtime.Serialization;
usingSystem.ServiceModel;
usingSystem.Text;

namespace WcfServiceLibrary1
{
   //NOTE: You can use the "Rename" command on the "Refactor" menu to change the
   //class name "Service1" in both code and config file together.

   publicclassService1 :IService1
   {
      /// This Function Return summation of two integer numbers

      publicint sum(int num1, int num2)
      {
         return num1 + num2;
      }
      ///This function returns subtraction of two numbers.
      ///If num1 is smaller than number two then this function returns 0.

      publicint Subtract(int num1, int num2)
      {
         if (num1 > num2)
         {
            return num1 - num2;
         }
         else
         {
            return 0;
         }
      }
      ///This function returns multiplication of two integer numbers.

      publicint Multiply(int num1, int num2)
      {
         return num1 * num2;
      }
      ///This function returns integer value of two integer number.
      ///If num2 is 0 then this function returns 1.

      publicintDivide(int num1, int num2)
      {
         if (num2 != 0)
         {
            return (num1 / num2);
         }
         else
         {
            return 1;
         }
      }
   }
}

要运行此服务，请在Visual Studio中点击开始按钮。

当我们运行这个服务，下面的屏幕会出现。

上点击sum方法，在下面的页面将被打开。在这里，可以输入任何两个整数，然后单击Invoke按钮。该服务将返回这两个数字的总和。

像求和，我们可以执行哪个都列在菜单中的所有算术运算。这里是捕捉他们。

当点击下页将出现在Sutbtarct方法。输入整数，点击调用按钮，得到的输出如下所示。

下页将出现在Multiply方法单击时。输入整数，点击调用按钮，得到的输出如下所示。

下面的页面上会出现当点击Divide方法时。输入整数，点击调用按钮，得到的输出如下所示。

一旦服务被调用，可以在它们之间，直接从这里切换。

主机WCF服务 - WCF教程

建立一个WCF服务后，下一步就是托管它，以便客户端应用程序可以使用，这就是所谓的WCF服务托管。 WCF服务可以通过使用任何的四种方法如下托管。

IIS主机 - IIS是Internet信息服务的缩写。它的工作模式是类似于ASP.NET，而托管的WCF服务。IIS托管的最大的特点是服务激活自动处理。 IIS主机还提供过程的健康监测，闲置关机，进程回收，还有更多的功能，以方便WCF服务托管。

自助主机 - 在一个WCF服务托管在托管应用程序中，它被称为自主机。它要求开发人员编写必要的编码ServiceHost 初始化。在自托管，WCF服务可以在各种类似控制台应用程序，Windows窗体等应用程序托管

WAS主机 - 在Windows激活服务主机的WCF服务(WAS)，它的功能如进程回收，空闲时间管理，通用配置系统，支持HTTP，TCP等

Windows服务主机 - 本地系统的客户端，这是最好的承载WCF服务作为一个窗口服务，这就是所谓的窗口服务主机。所有的Windows版本支持这种类型的托管，服务控制管理器可以控制WCF服务的流程生命周期。

消费WCF服务 - WCF教程

Windows通讯基础(WCF)服务允许其他应用程序访问或使用它们。 WCF服务可以消费，或由根据主机类型的方式访问。这里，我们说明由步骤方法的步骤以消费WCF服务，每个受欢迎的托管选项，即 –

消费WCF服务托管在IIS5/6

自托管消费WCF服务

消费WCF服务托管在Windows激活服务

消费WCF服务托管在Windows服务

WCF服务绑定 - WCF教程

WCF服务绑定是一个集合，每个元素定义了服务与客户端进行通信方式的几个元素。传输元素和一个消息编码元素各自结合两个最重要的组成部分。这里是WCF服务绑定常用的列表。

基础绑定

基础约束是由basicHttpBinding的类提供的，这种结合使用HTTP协议进行传输为目的，并代表一个WCF服务作为一个ASP.NET Web服务(ASMX Web服务)，这样方便ASMX Web服务的老客户可以使用新服务。这被设置为默认的受Silverlight启用WCF Web服务绑定，是一个标准Web服务通信的风格结合。这并不支持可靠的消息。

在下文中介绍的代码片段，描绘的默认设置基础绑定。

<basicHttpBinding>
  <binding name="basicHttpBindingDefaults" allowCookies="false"
     bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
     maxBufferPoolSize="524288" maxBufferSize="65536" maxReceivedMessageSize="65536"
     messageEncoding="Text" proxyAddress="" textEncoding="utf-8" transferMode="Buffer"
     useDefaultWebProxy="true" closeTimeout="00:01:00" openTimeout="00:01:00"
     receiveTimeout="00:10:00" sendTimeout="00:01:00">
        <readerQuotas maxArrayLength="16384" maxBytesPerRead="4096" maxDepth="32"
           maxNameTableCharCount="16384" maxStringContentLength="8192"/>
        <security mode="None">
           <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
           <message algorithmSuite="Basic256" clientCredentialType="UserName" />
        </security>
  </binding>
</basicHttpBinding>

上面的默认设置有其明显的局限性邮件大小是有限的，在这里安全模式也无法比拟。但是基本的结合解决了这个问题类似下面的定制。

<basicHttpBinding>
  <binding name="basicHttpSecure" maxBufferSize="100000"
     maxReceivedMessageSize="100000">
     <readerQuotas maxArrayLength="100000" maxStringContentLength="100000"/>
     <security mode="TransportWithMessageCredential" />
  </binding>
</basicHttpBinding>

Web服务（WS）绑定

这是通过WSHttpBinding类提供，此绑定相似于基础约束，并使用相同的协议进行传输，但提供了几个WS- 规范，比如WS- 可靠消息，WS- 事务，WS- 安全，还有更多。简而言之，WsHttpBinding等于总结basicHttpBinding和WS- 规范。在这里，在下文中介绍的代码片段，说明默认设置WS绑定。

<wsHttpBinding>
  <binding name="wsHttpBindingDefaults" allowCookies="false" bypassProxyOnLocal="false"
     closeTimeout="00:01:00" hostNameComparisonMode="StrongWildcard"
     maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
     openTimeout="00:01:00" receiveTimeout="00:10:00" proxyAddress=""
     sendTimeout="00:01:00" textEncoding="utf-8" transactionFlow="false"
     useDefaultWebProxy="true" >
        <readerQuotas maxArrayLength="16384" maxBytesPerRead="4096" maxDepth="32"
           maxNameTableCharCount="16384" maxStringContentLength="8192"/>
        <reliableSession enabled="false" ordered="true" inactivityTimeout="oo:10:00" />
        <security mode="Message">
           <message algorithmSuite="Basic256" clientCredentialType="Windows"
              esatalishSecurityContext="true" negotiateServiceCredential="true" />
           <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
        </security>
  </binding>
</wsHttpBinding>

IPC绑定

这种结合使得使用命名管道，由netNamedPipeBinding类提供。这是最快的约束和所有可用的绑定是最安全的。虽然，消息级安全性这里不支持，消息是因为一个强大的运输保障的默认安全。在这里，下面的代码片段，说明默认设置为IPC结合。

<netNamedPipeBinding>
  <binding name="netPipeDefaults" closeTimeout="00:01:00"
     hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
     maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536"
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
     transactionFlow="false" transactionProtocol="OleTransactions"
     transferMode="Buffered" >
        <readerQuotas maxArrayLength="16384" maxBytesPerRead="4096" maxDepth="32"
           maxNameTableCharCount="16384" maxStringContentLength="8192"/>
        <security mode="Transport">
        </security>
  </binding>
</netNamedPipeBinding>

其他类型的服务绑定如下：

TCP Binding - 由NetTcpBinding类结合TCP协议的通信在同一网络内，并且不会以二进制格式信息编码。这种结合被认为是最可靠的对比。

WS Dual Binding - 这种结合便于双向通信，即消息可以被发送和接收的客户端和服务的唯一例外的是wsHttpBinding。这是由WSDualHttpBinding类提供的。

Web binding - 这种结合被设计为表示WCF服务中的HTTP请求的形式，通过使用HTTP的GET和HTTP的POST等方式，这是可用的WebHttpBinding类，并与社会网络常用。

MSMQ Binding - 这个绑定由NetMsmqBinding类，还提供用于提供在情况下，服务于一个不同于客户端发送的处理消息时间的解决方案。这种结合使得使用MSMQ传输，并提供支持的消息队列。 MSMQ是微软提供的队列消息实现。

Federated WS Binding - 这种结合是由WSFederationHttpBinding类提供。这是WS结合的一种具体形式，并提供支持，以联合安全。

Peer Network Binding - 由NetPeerTCPBinding类提供，该结合主要是用在文件共享系统，例如种子和TCP协议中使用。它使用TCP协议等网络运输。在这个网络中每个机器（节点）充当客户端和一个服务器到另一个节点。这是用在像奔流的文件共享系统。

MSMQ Integration binding - 这种结合是由MsmqIntegrationBinding类提供的。这种结合提供支持MSMQ（微软消息队列），使现有通信系统进行通信。

除了这些，还可以创建自定义绑定。然而，由于它能够调整每个WCF配置属性绑定，需要创建自定义绑定的产生极少。

WCF实例管理 - WCF教程

这组由Windows通讯基础(WCF)结合一组消息(客户端请求)服务实例所采用的技术被称为实例管理。一个完全由三种类型实例激活支持WCF，它们如下所述。

1.每个调用服务

每次调用服务是Windows通讯基础的默认实例激活模式。当一个WCF服务配置为每个调用服务，一个CLR对象是时间跨度客户调用或请求进行创建。 CLR代表公共语言运行库，并在WCF服务实例。

在每个调用服务，每一个客户端请求实现专用消耗相同的内存并且新的服务实例较少，相较于其他类型的实例激活。必需有InstanceContextMode属性，以指示WCF服务以充当每次调用服务被设置为InstanceContextMode.PerCall。InstanceContextMode属性属于ServiceBehavior属性。

因此，每调用服务可以被配置为

[ServiceContract]
interface IMyContract
{...}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract
{...}

服务在这里表示为IMyContract。

每次调用服务实例激活的过程可以描述如下图。

实现每个调用服务

[DataContract]
  class Param {....}
  [ServiceContract]
  interface IMyContract
  {
     [OperationContract]
     void MyMethod(Param objectIdentifier);
  }
  class MyPerCallService : IMyContract, IDisposable
  {
     public void MyMethod(Param objectIdentifier)
     {
        GetState(objectIdentifier);
        DoWork();
        SaveState(objectIdentifier);
     }
     void GetState(Param objectIdentifier) {....}
     void DoWork() {....}
     void SaveState(Param objectIdentifier) {....}
     public void Dispose() {....}
  }

这里，参数是用于创建对上述实施例的模拟类型的参数。

2.每个调用服务

在此激活WCF模式，私有或者我们可以说这是一个保密的会话保持两个实体，即客户端和特定的服务实例。也被称为私有会话服务，该模式提供了其始终致力于为每一个客户要求和自主各有关该会话感知服务的其他情况下的一个新的服务实例。

InstanceContextMode属性需要设置为PerSession发起这个每会话服务。在这里，服务实例保留在内存中全部通过会话持续时间。从可扩展性的激活模式受到所配置的服务是不是能够支持任何额外出色的客户比其他几个或可能达到一些，因为涉及的每一个专用服务实例的成本。

因此，每个会话服务可以被配置为

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract
{...}

每个会话服务的过程可以被描述为下面的图。

下面的代码显示了配置为私有会话的使用合约和服务。输出表示该客户端确实有一个专门的服务实例。

服务代码

[ServiceContract(Session = true)]
  interface IMyContract
  {
     [OperationContract]
     void MyMethod();
  }
  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
  class MyService : IMyContract, IDisposable
  {
     int m_Counter = 0; MyService() { Console.WriteLine("MyService.MyService()"); }
     public void MyMethod()
     {
        m_Counter++;
        Console.WriteLine("Counter = " + m_Counter);
     }
     public void Dispose()
     {
        Console.WriteLine("MyService.Dispose()");
     }
  }

客户端代码

MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod();
proxy.Close();

输出

MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()

3.单例服务

在此活化的WCF模式下，所有客户端请求独立于彼此，它们到服务端点的连接会连接到相同的单实例。只有当主机关机那么单例服务得不到处理。

这项服务是刚刚创建创建主机时。在这种情况下，主机不提供任何单一实例，该服务将返回为NULL。激活模式是最好的时候，每个方法调用的工作量少，无等待的操作后台有没有在运行。

InstanceContextMode属性需要设置为InstanceContextMode.Single启动这一单例服务。

因此，一个单例服务可以被配置为

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}

单例服务的过程可以被描述如下图所示。

单例代码实例的初始化和托管

服务代码

[ServiceContract]
interface IMyContract
{
  [OperationContract]
  void MyMethod( );
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : IMyContract
{
  int m_Counter = 0;
  public int Counter
  {
     get
     {
        return m_Counter;
     }
     set
     {
        m_Counter = value;
     }
  }
  public void MyMethod( )
  {
     m_Counter++;
     Trace.WriteLine("Counter = " + Counter);
  }
}

主机代码

MySingleton singleton = new MySingleton( );
singleton.Counter = 42;

ServiceHost host = new ServiceHost(singleton);
host.Open( );
//Do some blocking calls then
host.Close( );

客户端代码

MyContractClient proxy = new MyContractClient( );
proxy.MyMethod( );
proxy.Close( );

输出

Counter = 43

WCF事务 - WCF教程

事务处理在WCF(Windows Communication Foundation)是一套遵循一些性质，统称为ACID的操作。这里，如果一个操作出现故障，整个系统就会自动失败。如网上订单生成，就可能使用事务。下面的例子可以帮助理解事务的过程中更简单的术语。

例子

假设一台液晶电视是您从在线商店订购，你会通过信用卡支付的金额。当输入必要的信息来下订单，同时出现两个操作。一个特定的量被从您的银行账户中扣除，第二是供应商贷记相同。两个操作必须以有一个成功的事务成功执行。

WCF事务属性

WCF事务有以下的四个属性。

原子性 – 所有的操作都必须作为在完成一个事务的一个不可分割的操作。

一致性 – 无论是什么操作设置，系统始终处于的状态总是按照预期的，即事务的结果一致性。

隔离性 – 系统的中间状态是不可见的外部世界的任何实体，直到交易完成。

持久性 – 提交状态保持无论任何形式的故障（硬件，停电等）。

在配置一个WCF事务，有一些因素需要考虑。这些约束力和操作行为。

绑定 – 支持事务的WCF绑定只有几个，这是至关重要的，从只有这些绑定，默认情况下处于禁用状态，并应能获得事务所需支持做出选择。这些绑定说明如下。

NetTcpBinding

NetNamedPipeBinding

WSHttpBinding

WSDualHttpBinding

WSFederationHttpBinding

操作行为 – 同时结合促进事务传播的路径，操作负责和操作配置的是至关重要的。两个属性的主要用途是相同的。它们是TransactionFlow和TransactionScopeRequired。这里应当注意的是，TransactionFlow属性主要具有三个值，它们是Allowed, Mandatory 和NotAllowed。

下面的代码显示了改变的约束力和事务约定配置是否有利于客户的传播规范。

<bindings>
  <wsHttpBinding>
     <binding name ="MandatoryTransBinding" transactionFlow ="true">
        <reliableSession enabled ="true"/>
     </binding>
  </wsHttpBinding>
</bindings>

事务协议

WCF使用三种协议事务，这些都是轻量级，旧事务和WS-原子事务（WS-AT）。WS-AT是一种可互操作协议，可以跨防火墙的流量分布式事务。然而，该协议不应当事务是严格基于微软技术使用。

WCF事务阶段

有两个阶段一个WCF事务，如下所述。

准备阶段 - 在这个阶段，事务管理器检查是否所有的实体准备好提交的事务。

提交阶段 - 在这个阶段，实体的提交在现实中得到开始。

理解一个WCF事务的两相的功能，让我们看看下面的图。

启用WCF事务处理

要成功地使一个WCF事务成功，需要遵循一系列的六个步，。必要的步骤如下所示。

步骤1：创建两个WCF服务

在这方面，最重要的一步是建立在WCF中两个服务项目，参与到一个事务。数据库事务将在这两个服务的执行，并且应当理解，它们是如何被一个WCF事务统一。 WCFTransactions的web应用程序也被创建在单个事务范围占用两个创建的服务。

第2步：创建方法并且其属性有TransactionFlow属性

这里，UpdateData方法将被创建为将WCF服务插入到具有OperationContract特性的数据库。为了完成这个任务，接口类ServiceContract首先创建。用于实现该事务在新创建的方法，它具有TransactionFlow属性和事务都使用相同的值。

[ServiceContract]
  public interface IService1
  {
     [OperationContract]
     [TransactionFlow(TransactionFlowOption.Allowed)]
     void UpdateData();
  }

第3步：WCF服务带有TransactionScopeRequired属性的实现

由下面所示的编码完成。

[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData()
{
  try
  {
     SqlConnection objConnection = new SqlConnection(strConnection);
     objConnection.Open();
     using(SqlTransaction transaction = Program.dbConnection.BeginTransaction())
     {
         Boolean doRollback = false;
         using(SqlCommand cmd = new SqlCommand("insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
         try
         {
           cmd.ExecuteNonQuery();
         }
         catch(SqlException)
         {
           doRollback = true;
           break;
         }
     }
     if(doRollback)
        transaction.Rollback();
     else
        transaction.Commit();

  }
  finally
  {
      objConection.Close();
  }
}

步骤4：由WCF服务配置文件启用事务流程

相同编码如下面给出：

<bindings>
  <wsHttpBinding>
     <binding name="TransactionalBind" transactionFlow="true"/>
  </wsHttpBinding>
</bindings>

重要的是要重视事务允许的终点绑定暴露WCF服务。

<endpoint address="" binding="wsHttpBinding"
    bindingConfiguration="TransactionalBind" contract="WcfService1.IService1">

第5步：在一个事务中调用两个服务

这里，上述两种服务被称为在一个事务中，为此目的，所述的TransactionScope对象用于这两个服务。上述对象的完整方法被调用来提交WCF事务。如果回滚，那么Dispose方法被调用。

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
  try
  {
     // Call your webservice transactions here
     ts.Complete();
  }
  catch (Exception ex)
  {
     ts.Dispose();
  }
}

以下的小片的完整代码，其中WCF提交数据已经被分组描述在一个范围。

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
  try
  {
     ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
     obj.UpdateData();
     ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
     obj1.UpdateData();
     ts.Complete();
  }
  catch (Exception ex)
  {
     ts.Dispose();
  }
}

第6步：测试WCF事务

测试是在第6步，也是最后一步并调用第1个WCF服务后，发生异常（被迫）。

WCF RIA服务 - WCF教程

WCF RIA Service是更高层次的框架，像.NET 4和Silverlight4框架，简化构建在Silverlight中一个复杂的业务应用程序通过提供客户端验证的过程的新的组成部分。 RIA代表富Internet应用程序。这里必须注意的是，提供的微软，Silverlight是一个框架，理想的富互联网应用程序，并且可以作为浏览器插件，和Adobe Flash一样使用。

WCF RIA服务主要是基于WCF服务的标准版本。要了解有关WCF RIA Services的更好的方式，如下图所示的架构，WCF RIA服务有重点。 DB在这里为数据库中的缩略形式。

创建WCF RIA Service在下一步会有一个更深入的了解。按照下面给出的按部就班地进行就可以了。

步骤1：使用Silverlight5创建名为SLWCFRiaServices.Web的一个新的Web项目，然后选择ADO.NET实体数据模型，以相同的添加一个新的项目。

第2步：现在，通过生成从数据库模型选择的实体数据模型向导模式的内容。

步骤3：从同一个向导，请选择数据连接和数据库对象。

第4步：生成解决方案，以便在未来的认识的数据模型是不是要创建的域名服务问题。

第5步：现在，通过添加新的项目创建在Web项目中的域名服务，确保让客户端访问。

步骤6：在紧接着的下一个步骤，产生了一些类的会发生，因此有必要再次构建它们。

第7步：在这一步，DataDomainContext示出了数据源面板。

第8步：下面DataDomainContext文章应选择并应进行定制。

第9步：连接DataGrid控件的数据源是在这里承诺以及选择的主题，如在此步骤BureauBlue主题已被选中。

步骤10：最后一个和最后步骤包括将要设计的屏幕，并通过简单的拖放添加实体在MainPage布局面积。同样重要的是要确保AutoGenerateColumns=“true”，并运行它来查看输出。

先决条件

有一些先决条件经历WCF RIA服务的攻略，如下面。

Visual Studio 2010/ Visual Studio 2012

Silverlight Developer Runtime

Latest version of RIA Services Toolkit

SDK (Software Development Kit)

WCF RIA域名服务

一个域的服务包括一组相关的业务数据操作，并没有什么，但它暴露任何WCF RIA服务应用程序的业务逻辑WCF服务。

一个WCF RIA域名服务有内部托管类DomainServiceHost又使用WCF的ServiceHost类的托管应用程序。为了让域名访问服务的客户端项目，它应该有EnableClientAccessAttribute属性。每当一个新的域服务类添加属性得到自动应用。

下图显示了WCF RIA域名服务的体系结构

WCF RIA Services数据查询

下面的图显示了如何将查询客户端上创建和在服务器侧执行返回Jqueryable结果。但必须注意的是，DAL是这里的数据访问层。

WCF RIA Services更新数据

该图显示了数据是如何通过执行CUD更新服务器端（创建，更新，删除）操作。这里应注意的是，WCF RIA服务总是无状态的服务器端。

WCF安全 - WCF教程

一个强大的WCF服务安全系统，拥有两种安全模式或级别预期的客户端可以访问的服务。这是常见的分布式事务的安全威胁正在放缓，在很大程度上由WCF决定。

关键的安全功能

WCF服务有四个主要的安全功能，如下图所示。

认证- 这里认证是不限定于识别消息的发送者，但是相互的，即消息接收器的认证是必需的，以排除任何种类的中间人攻击的可能性。

授权- 这是采取了一个WCF服务，以确保安全性的下一步骤，并在此确定服务是否应授权调用方进一步或不会进行。虽然授权不依赖于身份验证时，它通常如下认证。

保密 - 调用者和服务之间的信息交流是保密的，限制其解释并不打算为其他人公开消息。为了使这成为可能，加密与各种各样的其他机制一起使用。

完整性- 最后一个关键概念是保持完整性，即提供了保证，该消息尚未从发送者到接收者不被任何人在这一过程篡改。

传输安全模式

WCF提供以下传输安全模式，以确保在客户机和服务器之间的安全通信。多样传输安全模式如下所述。

None - 此模式不能保证任何消息安全和服务不获取有关客户端的任何凭据。这种模式是非常危险的，因为它可以使信息被篡改，因此不推荐使用。

<wsHttpBinding>
   <binding name="WCFSecurityExample">
      <security mode="None"/>
   </binding>
</wsHttpBinding>

Transport - 这种模式是实现信息通过使用通信协议，如TCP，IPC，HTTPS和MSMQ一个安全的传输的最简单方法。这种模式是比较有效的，当在传输点至点，并主要是用于在受控环境中，也就是说，内部网应用。

<wsHttpBinding>
   <binding name="WCFSecurityExample">
      <security mode="Transport"/>
   </binding>
</wsHttpBinding>

Message - 安全模式可以相互验证，并提供隐私的消息进行加密，并且可以通过http，这不被认为是一种安全协议被传输在很大程度上。这里的安全性提供了端 - 端，而不考虑有多少中介参与消息传送和是否有一个安全的运输或没有。该模式是通过互联网应用程序通常使用。

<wsHttpBinding>
   <binding name="WCFSecurityExample">
      <security mode="Message"/>
   </binding>
</wsHttpBinding>

Mixed - 这种安全模式是不经常使用，客户端身份验证仅在客户端级别提供。

<wsHttpBinding>
   <binding name="WCFSecurityExample">
      <security mode="TransportWithMessageCredential"/>
   </binding>
</wsHttpBinding>

Both - 此安全方式包括两种传输安全性和信息的安全性，提供了健壮的安全盖，但通常会导致超载的整体性能。这一个仅由MSMQ支持。

<netMsmqBinding>
   <binding name="WCFSecurityExample">
      <security mode="Both"/>
   </binding>
</netMsmqBinding>

所有的WCF绑定，除非有basicHttpBinding传输安全性默认情况下有一定关系。

消息安全级别

消息级安全性不依赖于WCF协议。它是通过使用一个标准的算法对数据进行加密采用与消息数据本身。有若干客户端凭证可用于不同的绑定的消息的安全级别，这些将在下面讨论。

WCF消息级安全性的客户端证书

None :在此，使用加密来保护该消息而被执行，这意味着，该服务可以由一个匿名客户访问没有客户机认证。除了basicHttpBinding，所有的WCF绑定支持此客户端凭据。然而，应当注意的是，对于NetNamedPipeBinding客户端凭证不可用。

Windows - 在这里无论是信息的加密和认证的客户端发生了一个实时登录的用户。在此情况下，也不同于所有其他的WCF绑定，NetNamedPipeBinding不可用以及basicHttpBinding不提供支持。

UserName - 这里消息被加密，以及通过提供用户名固定，而客户端进行认证，因为它们需要提供密码。 basicHttpBinding就像上面的两个客户端凭证，不支持用户名和它不适用于NetNamedPipeBinding。

Certificate - 随着信息加密，客户端和服务获得与证书的身份验证。此客户端证书可用，并且支持所有的WCF绑定，除了NetNamedPipeBinding。

IssuedToken - 类似CardSpace从一个机构颁发的令牌用于验证的消息。这里也进行消息的加密。

下面的代码显示了客户端凭据如何配置WCF的信息安全等级/模式。

<netTcpBinding>
   <binding name="WCFMessageSecurityExample">
      <security mode="Message">
         <message clientCredentialType="None"/>
      </security>
   </binding>
</netTcpBinding>

<netMsmqBinding>...</netMsmqBinding>
</bindings>
<behaviors>...</behaviors>

这里，必须指出的是，传输安全模式具有超过该消息的安全级别的边缘，因为前者是更快。它不需要任何额外的编码，并提供互操作性的支持，并且因此不会降低整体性能。

然而，从安全角度考虑，将消息安全模式是更加健壮，并且独立的协议，并提供端到端的安全性。

WCF异常处理 - WCF教程

WCF服务开发者可能会遇到需要以适当的方式向客户端报告一些不可预见的错误。这样的错误，称为异常，通常是通过使用try/catch块来处理，但同样，这是非常具体的技术。

由于客户端的关注领域不是关于如何发生错误或因素导致的错误，SOAP错误的约定，用于从WCF服务的传送到客户端的错误消息。

故障分析合约使客户端能够发生在一个服务错误的文件视图。下面的例子给出了一个更好的了解。

步骤1：一个简单的计算器服务与除法运算，将创建一般常见的异常。

using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Runtime.Serialization;
usingSystem.ServiceModel;
usingSystem.Text;

namespace Calculator
{
   // NOTE: You can use the "Rename" command on the "Refactor" menu to change
   // the interface name "IService1" in both code and config file together.

   [ServiceContract]

   public interface IService1
   {
      [OperationContract]
      int divide(int num1, int num2);
      // TODO: Add your service operations here by www.yiibai.com
   }
}

该类编码文件显示如下：

现在，当我们试图让10除以零，计算服务将抛出一个异常。

该异常可以通过try/catch块来处理。

现在，当我们试图让任何整数除以0，它会因为我们在catch块中处理其返回值10。

步骤-2：FaultException异常用于在该步骤中进行通信的异常信息从服务客户端返回。

public int Divide(int num1, int num2)
{
   //Do something
   throw new FaultException("Error while dividing number");
}