这篇文章介绍了WCF,我们将试图了解WCF背后的基本概念,并试着实现一个小的WCF服务。同时,给出一些例子演示一个WCF服务是如何被调用和运行的。
Web服务应用程序之间的通信协议是非常重要的,web services提供了一个有效的方式来促进应用程序之间的通信,但是它也有一些局限性。第一个是应用程序之间只能基
于Http的方式进行通信;第二个局限就是web service仅提供了单向通信,没有提供半双工或全双工的通信方式。
使用WCF,我们可以定义我们的服务一次,然后配置它,就能够通过Http,Tcp,IPC,甚至MSMQ.
下面的表格展示了web service和WCF的不同点:
Web Service | WCF Service |
通信仅发生在HTTP上 | 通信可以发生在HTTP,TCP,IPC,甚至MSMQ上 |
仅能单向通信,请求响应的方式 | 通过配置,可以使用单向通信(单工)、请求响应(半双工)、甚至全双工通信 |
基于HTTP无状态的方式工作,寄宿于一个web服务器中 | 寄宿方式可以是web服务器,一个windows服务或者自我寄宿 |
注:除了以上不同点外,其它不同点比如实例管理、会话、数据表示和序列化等,这些知识不在这篇文章的讨论范围之内。 |
一个可视化的WCF服务看上去如下:
基本概念:
当我们说一个WCF服务能够在不同应用程序之间以不同的协议进行通信时,我们有必要理解我们该如何实现这个服务。如果我们想在一个应用程程序中使用一个WCF服务,那
么我们就有三个主要的问题要面对:
(1)站在客户的角度来讲,WCF服务坐落在哪里,也就是寄宿于哪里?
(2)一个客户如何访问WCF服务,使用什么样的协议,消息的格式等等?
(3)这个服务提供给客户一些什么样的功能?
一旦我们有了这三个问题的答案,然后创建并使用这个WCF服务对我们来说,将变得更加容易。WCF服务有个终结点(EndPoints)的概念。客户应用程序需要和WCF服务通信,
WCF服务就得提供一个EndPoint,以上三个问题的答案就是WCF Services中的ABC。实际上,ABC是WCF服务的三个主要部分,所以让我们一个接一个的处理这三个问题。
Address(地址):和一个Web Service一样,一个WCF服务也提供了一个客户用来获取该服务的URI,这个URI称为“WCF Service"的地址,这就解决了第一个问题”站在客户
的角度来讲,WCF服务坐落在哪里,也就是寄宿于哪里?“
Binding(绑定):一旦我们知道了WCF寄宿在哪里,我们就得考虑如何与这个服务进行通信。这里定义的”绑定"就是WCF如何处理通信,像其它的通信参数比如信息编码,
在Binding中,也可以定义。这就解决了第二个问题“一个客户如何访问WCF服务,使用什么样的协议,消息的格式等等?”
Contract(契约):现在仅存的问题就是一个WCF服务能提供什么样的功能。契约就定义了公共的数据属性和WCF服务提供给客户的公共访问接口。
在代码中使用
作为一个ASP.NET开发人员,我们会发现自己可能需要使用一个WCF服务,这时可能要写一个WCF服务。接下来我们要做的就是实现一个小的WCF服务,并了解WCF的ABC
是如何执行的。然后我将写一个小的应用程序来调用这个WCF服务。
我们创建了这样一个WCF服务:基于Pair数据类型的算术操作。这个Pair类型被我们的服务暴露给应用程序。我们将为这个Pair数据类型提供一个简单的加法和减法功能。
注意:我们将创建的WCF服务寄宿在一个控制台应用程序中,采用自我寄宿的方式进行演练。所以让我们创建一个控制台应用程序,然后增加一个WCF服务:
让我们从WCF服务的契约开始,我们需要从我们服务中暴露一个Pair数据类型,所以这个Pari类必须使用DataContract特性进行标记,这个特性指出。数据类型Pair能够被WCF服
务的消费者使用。同样,这个类的公共属性也要用DataMember特性进行标记,以表明客户能够使用这些属性以及这些属性能够被序列化和反序列化。
using System.Runtime.Serialization; namespace WcfServiceConsle { [DataContract] public class Pair { int m_first; int m_second; public Pair() { m_first = 0; m_second = 0; } public Pair(int first, int second) { m_first = first; m_second = second; } [DataMember] public int First { get { return m_first; } set { m_first = value; } } [DataMember] public int Second { get { return m_second; } set { m_second = value; } } } }
现在我们已经说明了我们的服务需要暴露的数据契约。下一步事情就是要指明这项服务的主要操作,也就是服务契约。让我们创建一个接口,这个接口列出了服务主要提供的功能。
为了暴露给服务以及使得客户使用,我们同样要在接口上使用一个服务契约(ServiceContract
)特性进行标记。
我们将不得不为这项服务提供的主要操作写方法,并用OperationContract特性进行标记以表明这个接口的操作能够被客户使用。
[ServiceContract] public interface IPairArihmeticService { [OperationContract] Pair Add(Pair p1, Pair p2); [OperationContract] Pair Subtract(Pair p1, Pair p2); }
现在我们已经详细说明了说有的DataContract,ServiceContract,以及我们服务的OperationContract.现在这个服务接下来要做的就是实现这些方法,为了完成这个,我们创建了
一个PairArihmeticService类来实现以上的接口方法 。
public class PairArihmeticService : IPairArihmeticService { Pair IPairArihmeticService.Add(Pair p1, Pair p2) { Pair result = new Pair(); result.First = p1.First + p2.First; result.Second = p1.Second + p2.Second; return result; } Pair IPairArihmeticService.Subtract(Pair p1, Pair p2) { Pair result = new Pair(); result.First = p1.First - p2.First; result.Second = p1.Second - p2.Second; return result; } }
让我们看看已经做的东西,以下这个类图展示了我们创建的类以及使用特性来说明的数据契约DataContract,服务契约ServiceContract和操作契约OperationContract.
后期内容待续.... 原文:http://www.codeproject.com/Articles/406096/A-beginners-tutorial-for-understanding-Windows