创世纪哈哈

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

还有很多,灰灰虫博客写的不错,嘿嘿,学习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)

 

posted on 2010-12-26 22:40  创世纪哈哈  阅读(444)  评论(0编辑  收藏  举报