宿主:上篇说的:服务契约、不知道大家看过没,这篇接着那篇讲废话
当我们写好了一个服务之后,要有地方放它,才能让客户端调用的时候找到它,这就是宿主,它是一种媒介,是一个位置。WCF在运行时必寄宿在“宿主程序”之上,WCF本身不能够独自运行(每个WCF服务必须宿主在一个Windows进程中)。而我们最熟悉的发布到IIS服务器上,其实IIS也是一种宿主。点击打开链接
ServiceHos类型:
当IIS或WAS作为宿主程序时,IIS和WAS会自动创建serviceHost类型
手动创建的基本语法:
public ServiceHost(type serviceType,params Uri[] baseAddresses);//type服务契约类型,上面继承的接口类,baseAddress基地址
宿主步骤
一、控制台应用程序:引用servicemodel、还有用来创建绑定的channels
二、创建类:MyHolleHost
Endpoint:
具体代码会设计到;当我们寄宿WCF服务的时候,我们须定义一个或是多个终结点,然后Serivce端通过监听这些终结点来处理Client发来的请求。
A、B、C即是Endpoint 的组成部分,它是服务器间通信调用的入口。
A(Address):服务在哪里?
通过一个URI唯一地址标识,可以找到要调用的WCF服务。
B(Binding):Howto communicate with service?
Binding实现在Client和Service通信的所有底层细节。
如:我们在客户端与服务端传输的时候采用的是什么样的编码,XML?Text?二进制?
采用哪种传输协议进行传输,TCP?Http?
以及采用什么样的机制解决安全问题,SSL?加密?…
C(Contract):What functionalities do the Service provide?
暴露某个WCFService所提供的所有有效的方法。
Contract实际上是把每个方法的转化成为相对应的消息。
还记得当年博客河畔那副美图吗?忘了没有关系、后面再给你一次机会:看去、不谢
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; using System.ServiceModel.Channels;//用于绑定 namespace HelloServiceHost { class Program { static void Main(string[] args) { using (MyHelloHost Host = new MyHelloHost()) { //调用方法,打开服务 Host.open(); Console.Read(); } } } public class MyHelloHost : IDisposable { // 定义一个服务对象 ,供下方使用 private ServiceHost _myhost; //封装对象:方便访问 public ServiceHost Myhost { //返回接口 get { return _myhost; } } //基地址:包含基本的传输协议 http/net.pipe等 客户端有用 public const string BaseAddress = "net.pipe://localhost"; //可选地址,选择性定义 客户端使用 public const string HelloServiceAddress = "Hello"; //服务契约实现类型: 引用*项目中的实现类:HelloService 需要添加对应项目的引用 public static readonly Type ServiceType=typeof(SayHelloService.HelloService); //服务契约接口:实现接口:IHelloService 一 一对应 public static readonly Type ContractType = typeof(SayHelloService.IHelloService); //创建绑定 需要一个地址 public static readonly Binding hellobinding = new NetNamedPipeBinding(); //创建一个服务对象 _myhost在上面定义了 protected void CreateHelloServiceHost() { //创建服务对象 serviceType服务契约定义的类型,baseAddresses一组长度可变的基地址数组 已经定义 _myhost=new ServiceHost(ServiceType,new Uri[]{new Uri(BaseAddress)}); //终结点Endpoint 服务的契约类型:接口类型,绑定,可选地址 _myhost.AddServiceEndpoint(ContractType, hellobinding,HelloServiceAddress); } #region open 打开服务方法 马金兴 2017年2月15日21:50:56 /// <summary> /// open 打开服务方法 /// </summary> public void open() { Console.WriteLine("开始启动服务……"); _myhost.Open(); Console.WriteLine("服务已经启动……"); } #endregion #region MyHelloHost 构造方法,创建服务 马金兴 2017年2月15日21:51:51 /// <summary> /// 构造方法,创建服务 /// </summary> public MyHelloHost() { CreateHelloServiceHost(); } #endregion #region Dispose 销毁 马金兴 2017年2月15日21:52:41 /// <summary> /// 销毁 /// </summary> public void Dispose() { if (_myhost != null) { (_myhost as IDisposable).Dispose(); } } #endregion } }
后记:
WCF三种宿主方式 :
一、IIS宿主
优点是在发生客户端请求时宿主进程会被自动启动,所以说大多数人还是经常用IIS来发布服务的。并且可依靠IIS来管理宿主进程的生命周期;必须采用Http作为通信协议来绑定。
二、手写代码宿主
就是这篇了,须根据绑定协议来编写相应的代码。服务的地址需要根据绑定所采用的通信协议来最终确立。所以绑定、协议都在宿主程序中去定义。
首先要定义一个服务对象,然后定义好终结点需要的三要素添加终结点,最后开启服务。ServiceHost对象会自动有一个销毁服务的方法,为的是当关闭这个服务的时候就销毁它。
三、写配置文件
这个会在后面写,相对而言代码量少很多
WCF的宿主还可以是 Windows服务、COM+应用程序、WAS(Windows ActivationServices,Windows进程激活服务)IIS、Windows应用程序,或简单的控制台应用程序及任何.net程序。
桥梁,定义服务契约、提供客户端访问基础