zoukankan      html  css  js  c++  java
  • WCF学习笔记一

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。
    整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有Http和Ftp的相关技术。
    是Windows平台上开发分布式应用最佳的实践方式。
    简单的归结为四大部分
    1>.网络服务的协议,即用什么网络协议开放客户端接入。
    2>.业务服务的协议,即声明服务提供哪些业务。
    3>.数据类型声明,即对客户端与服务器端通信的数据部分进行一致化。
    4>.传输安全性相关的定义。
    WCF的服务不能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。在我们的计算服务应用中,采用了两种服务寄宿方式:通过自我寄宿(Self-Hosting)的方式创建一个控制台应用作为服务的宿主(寄宿进程为Hosting.exe);通过IIS寄宿方式将服务寄宿于IIS中(寄宿进程为IIS的工作进行W3wp.exe)。客户端通过另一个控制台应用模拟(进程为Client.exe)。

    服务契约

    WCF采用基于契约的交互方式实现了服务的自治,以及客户端和服务端之间的松耦合。WCF包含四种类型的契约:服务契约、数据契约、消息契约和错误契约,这里着重于服务契约。从功能上讲,服务契约抽象了服务提供的所有操作;而站在消息交换的角度来看,服务契约则定义了基于服务调用的消息交换过程中,请求消息和回复消息的结构,以及采用的消息交换模式。

    一般地,我们通过接口的形式定义服务契约。通过下面的代码,将一个接口ICalculator定义成服务契约。WCF广泛采用基于自定义特性(Custom Attribtue)的声明式编程模式,我们通过在接口上应用System.ServiceModel.ServiceContractAttribute特性将一个接口定义成服务契约。在应用ServiceContractAttribute特性的同时,还可以指定服务契约的名称和命名空间。

    通过应用ServiceContractAttribute特性将接口定义成服务契约之后,接口的方法成员并不能自动成为服务的操作。在此方面,WCF采用的是显式选择(Explicit Opt-in)的策略:我们须要在相应的操作方法上面显式地应用OperationContractAttribute特性。

     1 using System.ServiceModel;
     2 
     3 namespace WCFLibrary
     4 {
     5     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IUser”。
     6     [ServiceContract]
     7     public interface IUser
     8     {
     9         [OperationContract]
    10         string ShowName(string name);
    11     }
    12 }

    创建服务

    当服务契约成功创建时,我们需要通过实现服务契约来创建具体的WCF服务。WCF服务要实现服务契约的借口,实现了所有的服务操作。

    namespace WCFLibrary
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“User”。
        public class User : IUser
        {
           public string ShowName(string name)
            {
                string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
                return wcfName;
            }
        }
    }
    View Code

    通过自我寄宿的方式寄宿服务

    WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成,如图3所示。由于三要素应为首字母分别为ABC,所以就有了易于记忆的公式:Endpoint = ABC。一个终结包含了实现通信所必需的所有信息,我们可以这样认识终结点的ABC:

    • 地址(Address):地址决定了服务的位置,解决了服务寻址的问题
    • 绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能(比如安全、可靠传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等;
    • 契约(Contract):契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。

    服务寄宿的目的就是开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或多个终结点,使之暴露给潜给的服务消费者。服务消费者最终通过相匹配的终结点对该服务进行调用。

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using WCFLibrary;
    
    namespace WCFHost_Console
    {
        /// <summary>
        /// 用控制台简历WCF类库的宿主程序
        /// </summary>
        internal class Program
        {
            private static void Main(string[] args)
            {
                //创建宿主的基地址
                var baseAddress = new Uri("http://localhost:8000/Users");
    
    
                using (var host = new ServiceHost(typeof (User), baseAddress))
                {
                    //向宿主中添加终结点
                    host.AddServiceEndpoint(typeof (IUser), new WSHttpBinding(), "");
                    //将HttpGetEnabled属性设置为true
                    var smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    //将行为添加到behaviors中
                    host.Description.Behaviors.Add(smb);
                    //打开宿主
                    host.Open();
                    Console.WriteLine("WCF中的http监听已开启!");
                    Console.ReadKey();
                    host.Close();
                }
            }
        }
    }
    View Code

    调用服务

    在客户端,要添加对服务的引用,可以采用VS自带的服务引用,他会自动的生成包含一个服务契约接口、一个服务代理对象和其他相关的类。然后我们就可以像调用普通的类的对象一样调用服务,当然我们也可以通过配置文件来实现服务的引用,在这里终结点一定要和服务宿主对象的某一个终结点相对应(因为一个服务可以有多个终结点)。

    客户端的配置文件如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
            <bindings>
                <wsHttpBinding>
                    <binding name="WSHttpBinding_IUser" />
                </wsHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:8000/Users" binding="wsHttpBinding"
                    bindingConfiguration="WSHttpBinding_IUser" contract="ServiceConsole.IUser"
                    name="WSHttpBinding_IUser">
                    <identity>
                        <userPrincipalName value="li-pcli" />
                    </identity>
                </endpoint>
            </client>
        </system.serviceModel>
    </configuration>
    View Code

    调用代码如下:

    using System;
    using WCFTestConsole.ServiceConsole;
    
    namespace WCFTestConsole
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                var client = new UserClient();
                string result = client.ShowName("哈哈哈");
                Console.WriteLine(result);
                Console.ReadKey();
            }
        }
    }
    View Code
  • 相关阅读:
    Eclipse快捷键大全
    OOA/OOD/OOP
    SQL Server 存储过程(转)
    PowerDesigner 生成数据库方法(转)
    CDM和PDM的区别?(转)
    委托存在的理由
    提问回顾
    对软件工程常见概念的一些见解
    Gulp插件笔记
    Pascal-S代码注释
  • 原文地址:https://www.cnblogs.com/lip0121/p/3823970.html
Copyright © 2011-2022 走看看