• WCF和SOA的简介


    1 什么是SOA:面向服务架构(service oriented architecture),他属于一种组件架构模式。SOA追求的是服务提供方和服务使用方的高度解耦。

    服务必须是自解释的,也就是说必须以某种标准的方式告诉整个soa系统该服务提供的功能。

    2 什么是WCF(windows communication foundation)

     本质上它是一套软件开发包。

    设计目的:为分布式计算提供可管理的方法,提供广泛的互操作性,为服务定位提供直接的支持

    提供的功能:托管,服务实例管理,异步,安全,事务管理,离线队列

    3 WCF体系框架

       契约:(数据契约,消息契约,服务契约,策略与绑定)定义服务端公开的方法,使用的传输协议,可访问的地址,传输的消息格式

       服务运行:(事物,调度,并发,参数筛选,限流,错误,元数据,实例行为,消息行为)

       消息:ws安全通道

      激活与宿主:自寄宿,iis寄宿,windows激活服务,windows服务和com+组件等

    4 wcf中的概念

      1 地址:每个服务都具有唯一的地址。

      2 绑定:

      3 契约:服务契约,数据契约,错误契约,消息契约

    5 终结点:(地址,绑定,契约)发送或接收消息的构造,每个服务可以拥有一个或者多个终结点

    6 元数据:服务公开的元数据包括xml架构文档(用于定义服务的数据协定)和wsdl文档(用于描述服务的方法)

    7 宿主:服务必须承载与某个进程中

    8 知道了wcf的概念那么如何创建wcf服务

       1 定义服务契约如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.ServiceModel;
    
    
    namespace HelloWorldService
    {
        [ServiceContract]
        public interface IService
        {
            [OperationContract]
            string HelloWorld(string name);
        }
    }

       2 实现服务契约

          像实现接口一样实现服务契约:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace HelloWorldService
    {
        public class Service : IService
        {
            public string HelloWorld(string name)
            {
                return name + "说:helloWorld";
            }
        }
    }

        3 创建服务的宿主

         终结点中的地址和绑定都会在宿主程序中定义,一个服务契约(servicecontract)是由一组服务操作(operationcontract)组成的,当选择iis作为宿主时,iis会自动创建serviceHost类型对象,一个绑定就代表了服务和外界通信的方式。

     基地址:一般包括通信协议和主机名

    可选地址:定义了服务的具体位置

    下面就使用servicehost对象来构建服务,以编程方式来简单的实现:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.ServiceModel;
    using System.ServiceModel.Channels;
    
    namespace HelloWorldService
    {
        public class MyServiceHost : IDisposable
        {
            private ServiceHost _myService;
    
            //使用netNamedPipeBingding协议,此协议不能跨主机进行通信,但是能够跨越应用程序域和进程通信
            public const string BaseAddress = "net.pipe://localhost";//基地址
            public const string HelloWorldServiceAddress = "HelloWorld";//服务的可选地址
    
            //服务契约定义类型
            public static readonly Type contractType = typeof(HelloWorldService.IService);
            //服务契约实现类型
            public static readonly Type serviceType =typeof( HelloWorldService.Service);
    
            //服务只定义了一个绑定
            public static readonly Binding HelloWorldBinding = new NetNamedPipeBinding();
    
            //构造servicehost对象
            protected void ConstructServiceHost()
            {
                //初始化servicehost对象
                _myService = new ServiceHost(serviceType, new Uri[] { new Uri(BaseAddress) });
                //添加一个终结点,可以添加多个
                _myService.AddServiceEndpoint(contractType, HelloWorldBinding, HelloWorldServiceAddress);
    
            }
    
            //servicehost只读属性
            public ServiceHost Host
            {
                get { return _myService; }
            }
    
            //打开服务
            public void Open()
            {
                Console.WriteLine("开始启动服务");
                _myService.Open();
                Console.WriteLine("服务已经启动.....");
            }
    
            //构造方法
            public MyServiceHost()
            {
                ConstructServiceHost();
            }
            public void Dispose()
            {
                if (_myService!=null)
                {
                    (_myService as IDisposable).Dispose();
                }
            }
        }
    }

    然后使用入口方法来启动服务:

     class Program
        {
            static void Main(string[] args)
            {
                MyServiceHost host = new MyServiceHost();
                host.Open();
            }
        }

    如下显示:

        

    4 下面手动编程来实现客户端访问服务端的工作

      首先客户端需要将服务的元数据导入,wcf提供clientbase<T>类型来创建代理类型,t为实际的服务契约类型实例化,绑定和地址则在构造方法中传入,代理类的定义如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.ServiceModel;
    using System.ServiceModel.Channels;
    
    namespace ProxyService
    {
        //硬编码定义服务契约
        [ServiceContract]
        interface IService
        {
            [OperationContract]
            string HelloWorld(string name);
        }
        class HelloWorldServiceProxy : ClientBase<IService>, IService
        {
            //硬编码定义绑定
            public static readonly Binding helloWorldBinding = new NetNamedPipeBinding();
            //硬编码定义地址
            public static readonly EndpointAddress helloWorldAddress = new EndpointAddress(new Uri("net.pipe://localhost/HelloWorld"));
            public HelloWorldServiceProxy() : base(helloWorldBinding, helloWorldAddress)
            {
    
            }
    
            public string HelloWorld(string name)
            {
                return Channel.HelloWorld(name);
            }
        }
    }
  • 相关阅读:
    Vi 和 Vim
    The C Programming Language-Chapter 5 Pointers and Arrays
    C# 4.0开始,泛型接口和泛型委托都支持协变和逆变
    数据库中的锁 and java StampedLock ReadWriteLock
    NetCore and ElasticSearch 7.5
    网关项目 ReverseProxy
    异常捕获&打印异常信息
    刷新:重新发现.NET与未来
    2019 中国.NET 开发者峰会正式启动
    .NET开发者必须学习.NET Core
  • 原文地址:https://www.cnblogs.com/mibing/p/7903858.html
Copyright © 2020-2023  润新知