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可以自动完成很多功能.不花时间写了...
- WCF初入(1) 开篇之二
- WCF初入(1) 开篇之一
- iOS进阶之runtime(1)开篇--初入江湖
- 初入HTML之二
- WCF教程二之WCF架构
- 初入andorid驱动开发之字符设备(二)
- 初入android驱动开发之网络设备以太网(二)
- 【WCF系列】之二:构建WCF的服务架构
- WCF探索之旅(二)——从零开始WCF实例
- WCF入门之二WCF应用的通信过程
- WCF之初体验
- 学习WCF之路1:Hello WCF!
- 我学WCF之旅(二)
- 初入Hibernate框架<二>
- 初入MyBatis框架<二>
- 入川之行(二)
- Unity3D之NGUI入坑<二>
- Dagger2入坑之旅 二
- Sruts2 学习笔记(马士兵教程 struts2.1.6版本) 第四天
- C#/.net分布式缓存系统Memcached 实例
- eclipse修改背景颜色
- 多层分布式开发 MIDAS 使用不同协议时的优缺点
- .net(C#)使用memcached
- WCF初入(1) 开篇之二
- Windows Phone开发(7):当好总舵主
- JDK 环境变量设置
- rotate translate alpha
- Javascript加强-节点的认识
- 用户的登录
- Android平台根据分辨率计算屏幕尺寸,基于物理尺寸来验证手机和平板应用合并的可行性
- JSTL常用函数
- Handle