WCF初入(1) 开篇之二

来源:互联网 发布:淘宝内部优惠券baidu 编辑:程序博客网 时间:2024/05/16 02:03

4.实现服务宿主和寄宿:

一个服务的存在和地址,绑定以及契约有关,地址定义了服务的位置,绑定定义了服务通信的方式,契约则定义了服务可以执行的操作.WCF使用终结点(EndPoint)来表示这样一种组成关系.从逻辑上说终结点就是服务真实的接口.


一个服务必须依赖于一个运行的进程(宿主),而指定宿主的过程称之为寄宿.宿主的一个功能就是公开服务的终结点,使外部能够访问.

using Ch01.Contract;using Ch01.Services;using System.ServiceModel;namespace Ch01.SelfHosting{    class Program    {        static void Main(string[] args)        {            //注册一个服务类的主机,并指定它的基地址为net.tcp://localhost:12580/            using (ServiceHost host = new ServiceHost(typeof(SelfHostingService),new Uri("net.tcp://localhost:12580/")))            {                //公开一个该服务的终结点                //它的地址为net.tcp://localhost:12580/SelfHostingHelloWorld                //采用NetTcpBinding绑定方式,使用TCP协议进行通信                //客户端可以执行IHelloWorld契约中定义的所有操作                //这些操作的实现由SelfHostingService类完成                host.AddServiceEndpoint(typeof(IHelloWorld), new System.ServiceModel.NetTcpBinding(), "SelfHostingHelloWorld");                //服务类支持元数据交换(Behavior是本地特性)                  if (host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() == null)                {                    System.ServiceModel.Description.ServiceMetadataBehavior metadata = new System.ServiceModel.Description.ServiceMetadataBehavior();                    host.Description.Behaviors.Add(metadata);                }                  //添加元数据交换终结点                if (host.Description.Endpoints.Find(typeof(System.ServiceModel.Description.IMetadataExchange)) == null)                {                    System.ServiceModel.Channels.CustomBinding cstmBinding = new System.ServiceModel.Channels.CustomBinding();                    System.ServiceModel.Channels.BindingElement elem = new System.ServiceModel.Channels.TcpTransportBindingElement();                    cstmBinding.Elements.Add(elem);                    host.AddServiceEndpoint(typeof(System.ServiceModel.Description.IMetadataExchange), cstmBinding, "metadata");                }                              host.Opened += delegate { Console.WriteLine("SelfHostingService 服务已启动,请按任意键结束"); };                host.Open();                Console.Read();            }        }    }}

关于元数据的问题,在MSDN上给出一段这样的定义:

Windows Communication Foundation (WCF) 为导出、发布、检索和导入服务元数据提供一个基础结构。WCF 服务使用元数据来描述如何与服务的终结点进行交互.以便类似 Svcutil.exe 的工具可以自动生成访问服务的客户端代码

目前还没有能力对元数据进行一番深究,以后可能会花几天时间弄清楚元数据的相关知识.目前可以肯定的是,如果客户端需要通过导入服务自动生成代理,那么就必须公开一个元数据交换终结点.否则,就必须在客户端实现一个代理类.

5.创建客户端:

在服务成功寄宿之后,服务端宿主便具有另一个功能:服务调用的监听工作.由于客户端无法和远程服务对象直接交互,实际上你必须实现一个代理类才可以调用服务.代理类其实就是服务类的客户端本地表示,它只将服务类中相似的数据和操作暴露给客户端,并不提供具体的实现.

有两种办法实现代理类:一种通过VS中引用服务功能,将元数据终结点的地址提供给工具,工具自动帮你生成服务契约,代理类和相关配置;第二种方法就是你自行实现这些细节

手动写代码的话需要:

创建一个服务契约

[ServiceContract]    public interface IHelloWorld    {        [OperationContract]        string GetHelloWorld();    }

实现代理

public class HelloWorldServicesClient : ClientBase<IHelloWorld>, IHelloWorld    {        #region IHelloWorld 成员        public string GetHelloWorld()        {            return base.Channel.GetHelloWorld();        }        #endregion    }

调用代理,可以通过button_click事件触发什么的

 private void btnSelfHosting_Click(object sender, EventArgs e)        {            using (SelfHostingProxy.HelloWorldServicesClient proxy = new Ch01.Client.SelfHostingProxy.HelloWorldServicesClient())            {                string msg = proxy.GetHelloWorld();                MessageBox.Show(msg);            }        }

6.通过IIS寄宿:

这个很简单,VS可以自动完成很多功能.不花时间写了...



原创粉丝点击