还有很多,灰灰虫博客写的不错,嘿嘿,学习ing
http://hi.baidu.com/grayworm/blog/item/0099fb356a07d881a71e12cb.html
一、什么是WCF
Windows Conmmunication Foundation是.NET Framework3.0的重要组成部份,现已经集成到Vista 和 WindowsServer2008中
它是Microsoft为构建面向服务的应用SOA提供的分布式通信编程框架,使用该框架,员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。它整合了.Net平台下所有的和分布式系统有关的技术,是微软分布式应用程序开发的集大成者。掌握了WCF,就相当于掌握了叩开SOA大门的钥匙。
从通信范围来看:它可以跨进程、跨机器、跨子网、企业网乃至于 Internet
从宿主程序来看:可以是控制台程序,IIS,Windows Forms,Windows Service等为宿主程序。
从支持的协议来看:它支持TCP,HTTP,命名管道,MSMQ等。
从安全模式来看:它支持SAML, Kerberos,X509,用户/密码,自定义等多种标准与模式。
二、WCF有三项突出的特性:
1.与多种现有微软分布式技术的统一性(集成性)
统一ASMX,.NET Remoting,TCP,命名管道,MSMQ等开发模型。为各种应用提供了单一的编程模型。
2.提供对不同平台互操作性的支持(跨平台)
通过标准的SOAP消息WCF可以与其他应用程序进行交互,很好地支持了跨平台跨操作系统的的目标。
3.以及显式的面向服务特性
三、WCF服务框架模型
WCF服务由三个重要部份组成:服务类,宿主程序和终结点。
服务类(Service):就是一个类,包含一系列的方法,通过这些方法向外界提供服务。类的本身还包括服务契约、操作契约和数据契约。
宿主(Host):一种应用程序域和进程,服务将在该环境中运行。
终结点(EndPoint):服务对外暴露出来的调用方式。
《图2》
例如:有一个医生想在一个小镇上为大家提供医疗服务,因此他在小镇上注册了一家诊所,镇上的人们可以来这里看病,或者打电话进行咨询。
在这个例子中,心理医生就是我们的“服务类”,它包含了提供心理咨询的行为;而诊所就是“宿主”,心理医生通过诊所向外提供服务;这位医生向镇上的人们提供两种服务方式,一种是在诊所为人们看病;另一种是通过电话为人们服务,这两种服务方式就是“终结点”,镇上的人们可以通过这两个终结点来获取服务。
服务类:
//服务类的契约
[ServiceContract]
public interface IBookService
{
[OperationContract]
void AddBooks(Book book);
[OperationContract]
List<Book> GetAllBooks();
[OperationContract]
void RemoveBook(string id);
}
//实现服务契约的类
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class BookService : IBookService
{
List<Book> _Books = new List<Book>();
public void AddBooks(Book book)
{
book.BookNO = Guid.NewGuid().ToString();
_Books.Add(book);
}
public List<Book> GetAllBooks()
{
return _Books;
}
public void RemoveBook(string id)
{
Book book = _Books.Find(p => p.BookNO == id);
_Books.Remove(book);
}
}
宿主:
public static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(BookService));
host.Open();
Console.WriteLine("Service is up and running.......");
Console.ReadLine();
host.Close();
}
终结点:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="NewBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="NewBehavior" name="Services.BookService">
<clear />
<endpoint address="basic" binding="basicHttpBinding" contract="Services.IBookService"
listenUriMode="Explicit">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"
listenUriMode="Explicit">
</endpoint>
<endpoint address="ws" binding="ws2007HttpBinding" contract="Services.IBookService"
listenUriMode="Explicit">
</endpoint>
<endpoint address="net.tcp://localhost:8888/BookService" binding="netTcpBinding"
contract="Services.IBookService" listenUriMode="Explicit">
</endpoint>
<endpoint address="net.pipe://localhost/BookService" binding="netNamedPipeBinding"
bindingConfiguration="" contract="Services.IBookService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/BookService" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
在WCF服务的三个部份中,终结点又是最复杂的,终结点由三部份组成:
Address:服务的调用地址。如果要通过“终结点”获得服务,就必须要有“终结点”的访问地址。如:要从医生处获取服务,就必须要有医生诊所的地址和医生的电话号码,
Binding:为“终结点”指定通信的信道(http,TCP等)。如:医生用“诊所看病”和“打电话”这两种信道来提供服务。
Contract:指明我们可以通过终结点获得什么样的服务。如:去诊所我们可以获得看病服务,而打电话只能获得咨询服务。
上面这三部份就是我们常说的终结点的“A-B-C”
<endpoint address="basic" binding="basicHttpBinding" contract="Services.IBookService"></endpoint>
《图3》
四、WCF服务与客户端通信的模型:
《图4》
服务器端:
首先、需要定义和实现WCF服务端契约
然后、在宿主程序中创建ServiceHost实例,向外提供“终结点”
最后、打开通讯信道,等待访问
客户端:
首先、根据服务器端提供的契约生成客户端的代理类。
然后、根据服务器端暴露的终结点信息在客户端生终结点的复本。
最后、通过代理类和终结点复本调用远程服务器端的功能。
在我们配置服务器端的终结点的时候我们需要添加一个“元数据终结点”,元数据终结点也有我们上面所述的A-B-C三个属性,只不是这里的C(契约)不再是我们定义的服务契约,而是IMetadataExchange类型的契约。在配置WCF服务的时候必须要为我们的服务配置这个“元数据终结点”,那这个元数据终结点到底要做的是做什么的,为什么是必需的呢?首先我们需要了解什么是“元数据”,所谓的“元数据”就是描述数据的数据,即描述当前服务有哪些服务契约、方法契约和数据契约以及终结点的信息。而“元数据终结点”就是向外界暴露元数据的终结点。当客户端添加WCF服务引用的时候,会首先通过元数据取得服务器端的契约信息、终结点信息,然后根据这些信息在客户端创建了代理类,我们在客户端调用WCF服务的过程实际上就是通过代理类调用WCF服务的过程。
还回到上面医生的例子中。医生在小镇上注册了一家诊所后,需要把他的诊所介绍给大家,所以医生就在报纸上为诊所刊登了广告,广告内容中介绍了诊所能为大家提供什么样的服务,诊所的地址,乘车路线,联系电话等,大家就可以通过广告来了解诊所的信息并很容易找到诊所取得服务。这份广告的内容实际上就是诊所的“元数据终结点”。
(原创:灰灰虫的家http://hi.baidu.com/grayworm)