zoukankan      html  css  js  c++  java
  • WCF系列 基础概念

    WCF全称Windows Communication Foundation,是微软构建面向服务的分布式编程框架。而它其实是统一了COM和.Net Remoting等分布式技术提供一个完整,通用,可靠的分布式编程模型。

    WCF作为一个服务,它具有ABC这三个特性。

    A->Address  地址

    地址包含服务位置和传输协议(传输样式)这两个元素。

    http://localhost:8001  基于http协议

    net.tcp://localhost:8002/Service  基于tcp协议

    net.Pipe://localhost/Pipe       基于进程间通信

    net.msmq://localhost/Queue    基于消息队列通信

    当然还有包括https和服务总线的协议模型。

    B->Binding   绑定

    绑定定义了服务间通信的基本方式。常用绑定如下:

    1. 基本绑定(BaseHttpBinding)
    2. TCP绑定(NetTcpBinding) 使用TCP协议实现了跨机器的通信。
    3. IPC绑定(NetNamedPipeBinding) 使用命名管道在同一机器的进程间通信。
    4. Web服务绑定(WSHttpBinding) 提供基于internet的通信。
    5. MSMQ绑定(NetMsmqBinding) 使用微软的消息队列通信

    6.当然WCF还定义了其他的一些不常用的绑定,我就不一一列举了。具体可以再编码时注意绑定选项。

    C->Contract  契约

    契约是描述服务功能的标准方式。

    服务契约(ServiceContract) 描述客户端可用服务操作

    数据契约(DataContract)   定义与服务交互的数据类型

    错误契约(FaultContract)   定义服务抛出的错误操作

    消息契约(MessageContract)  允许服务于消息交互

    EndPoint  终结点

    终结点的功能就是组装ABC暴露给调用服务的客户端,让客户端能够获得该服务的ABC这3个元素信息。

    终结点的可以通过配置文件也可以通过编码,通过配置文件配置WCF服务信息比较灵活,修改参数也无需重新编译发布。而通过编码方式个人感觉能控制的更加精准,并且能够充分理解WCF的配置体系。

    Host 宿主

    WCF服务必须托管的宿主进程中,自托管,IIS发布,WAS宿主引擎。

    Mex 元数据

    WCF服务元数据是WCF服务的核心部分ABC的原始描述信息,暴露服务元数据的重要原因就是解决了异构客户端服务交互的关键问题。 元数据基于XML,自描述。客户端可以根据服务的元数据反序列换生成本地代码。

    一个简单的Demo

    如下为一个自托管的基于tcp协议的WCF服务端和客户端的基本实现,服务的发布采用编码模式

     private void StartAPPWCFService()
            {
               
                string serviceAddress = string.Format("net.tcp://{0}:{1}/", "localhost", CommonData.Configuration.Port);
    
                Dictionary<Type, Type> sevtypes = new Dictionary<Type, Type>();
               sevtypes.Add(typeof(IPersonService), typeof(PersonService));
               sevtypes.Add(typeof(ISafetyService), typeof(SafetyService));
                sevtypes.Add(typeof(IPressureService), typeof(PressureService));
               
                string endpointAddress = string.Empty;
                string tName = string.Empty;
                foreach (var item in sevtypes)
                {
                    tName = item.Value.Name;
                    endpointAddress = serviceAddress + tName;
                    ServiceHost serviceHost = new ServiceHost(item.Value, new Uri(endpointAddress));
                    //加载元数据结点
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    serviceHost.Description.Behaviors.Add(smb);
                    serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
                    //加载NetTcpBinding结点
                    NetTcpBinding netTcpBinding = SetTCPBinding();
                    serviceHost.AddServiceEndpoint(item.Key, netTcpBinding, endpointAddress);
                    serviceHost.Open();
                    listServiceHost.Add(serviceHost);
                }
            }
    服务器端

    客户端中添加服务引用(net.tcp://127.0.0.1:18001/SafetyService/mex)后即可直接调用服务获取数据,客户端的调用配置信息由系统自动生成

    SafetyService.SafetyServiceClient client = new SafetyService.SafetyServiceClient();
     Console.WriteLine(client.getData());
    客户端代码

    2015年强迫自己写技术博,这是WCF系列第一期,后续会陆续更新。

  • 相关阅读:
    002Python和JS的不同进制之间的转换实现
    001JS中的非严格相等 ==
    028_同步本地git项目到github和码云
    015你所常见的日常英语
    001CSS三大特性
    014国家地区语言缩写码
    013常用的英语词典Share
    012_犯人的夏日的蚊虫叮咬词汇
    011_中文"上火"的英文怎么说
    我的IT之路这样走过
  • 原文地址:https://www.cnblogs.com/qyzBlog/p/4205574.html
Copyright © 2011-2022 走看看