[转]十五天精通WCF——第五天 你需要了解的三个小技巧
一: 服务是端点的集合
当你在开发wcf的时候,你或许已经注意到了一个service可以公布多个endpoint,确实是这样,在wcf中有一句很经典的话,叫做“服务是端点的集合",就
比如说一个普普通通的服务,它就公布了一个服务端点,一个元数据端点,对吧。。。

仔细一想,这个问题就好玩了,既然一个service可以公布多个endpoint,而且我还知道wcf中有很多的binding,这些binding对应着很多的传输方式,那是不是
说我一个service可以用多种协议方法对外公布,比如说同时以nettcp,basic,msmqbinding,udp等方式公布,对吧,那这样的话是不是超级好玩,如果对方
是非.net程序,那就可以调用我的basic,如果对方是.net程序,那是不是可以调用我的nettcp,对不对。。。当然啦,wcf无所不能,这是一个史上无比强大的牛
逼框架,牛逼的要死,已经逼得程序员只需随便改几个配置就能达到完全不一样的效果。。。下面我同时用nettcp和basic的方式来同时公布服务,好了,现在我
们就来见证奇迹吧。。。
Service:

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading; namespace MyService
{
public class HomeService : IHomeService
{
public Student Update(Student message)
{
return new Student() { Name = "一线码农" };
}
} [DataContract]
public class Student
{
[DataMember]
public string Name { get; set; } [DataMember]
public int Age { get; set; }
}
}

Host :

class Program1
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(HomeService), new Uri("http://192.168.1.105:1920")); host.AddServiceEndpoint(typeof(IHomeService), new BasicHttpBinding(), "HomeServie"); host.AddServiceEndpoint(typeof(IHomeService), new NetTcpBinding(), "net.tcp://192.168.1.105:1921/HomeServieTcp"); host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true }); host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); host.Open(); Console.Read();
}
}

Client端:

class Program
{
static void Main(string[] args)
{
//basic 方式
ChannelFactory<IHomeService> factory = new ChannelFactory<IHomeService>(new BasicHttpBinding(),
new EndpointAddress("http://192.168.1.105:1920/HomeServie")); var client = factory.CreateChannel(); var result = client.Update(new Student() { }); //nettcp方式
factory = new ChannelFactory<IHomeService>(new NetTcpBinding(),
new EndpointAddress("net.tcp://192.168.1.105:1921/HomeServieTcp")); client = factory.CreateChannel(); result = client.Update(new Student() { });
}
}

通过上面的代码,是不是已经发现,我在client端,既可以用basic的方式调用,又可以用nettcp的方式调用,这个技巧是不是感觉wcf无比强大呢???
二:Host寄宿多个Service
我们知道wcf的寄宿方式有很多种,有iis,有windowservice,还有简单方便的console方式,而默认情况下,我们最通常的方法都是一个service,一个寄宿,
而其实呢??? 其实一个寄宿host可以承载多个service,看起来是不是很好玩,如果说你有10个servcie,现在你只需要用一个console host就能寄宿起来,废
话不多说,我演示一下给你看就好了。
Service:

namespace MyService
{
[ServiceContract]
public interface IHomeService
{
[OperationContract]
Student Update(Student message);
} [ServiceContract]
public interface IFlyService
{
[OperationContract]
Student Fly(Student stu);
}
}

Host:

class Program1
{
static void Main(string[] args)
{
//第一个: 这是Home服务
ServiceHost host = new ServiceHost(typeof(HomeService), new Uri("http://192.168.1.105:1920"));
host.AddServiceEndpoint(typeof(IHomeService), new BasicHttpBinding(), "HomeServie");
host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
host.Open(); Console.WriteLine("Home服务开启。。。。"); //第一个: 这是Fly服务
var host2 = new ServiceHost(typeof(FlyService), new Uri("http://192.168.1.105:1930"));
host2.AddServiceEndpoint(typeof(IFlyService), new BasicHttpBinding(), "FlyServie");
host2.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
host2.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
host2.Open(); Console.WriteLine("Fly服务开启。。。。"); Console.Read();
}
}


有没有看到,现在两个服务都开启了,这种方式看起来是不是很爽呀,否则的话,你需要开启两个Host,这样的话,我的手续就精简了。。。对吧。。
三: Tcp中的端口共享
这玩意听起来大家都懂,端口共享嘛,不就是两个程序共享一个端口,对吧,在通常情况下,我们肯定会认为这无法做到,其实呢?在Wcf中我们还是可以玩
的,也就是一个PortSharingEnabled的事!!!如果说端口可以共享的话,那我们的service是不是就可以少开辟几个端口呢?同样这也方便我们进行service的管
理,下面我给大家继续演示一下。。。很好玩的,么么哒

可以看到,我的两个host都是用1920的端口,并且现在我真的开启起来啦。。。。好了,三种技巧都说到了,我想你在现实的wcf开发中,或多或少的都能接
触的到,希望对你有用~~~~
[转]十五天精通WCF——第五天 你需要了解的三个小技巧的更多相关文章
- 十五天精通WCF——第五天 你需要了解的三个小技巧
一: 服务是端点的集合 当你在开发wcf的时候,你或许已经注意到了一个service可以公布多个endpoint,确实是这样,在wcf中有一句很经典的话,叫做“服务是端点的集合",就 比如说 ...
- 十五天精通WCF——第一天 三种Binding让你KO80%的业务
转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了, 再简单的话马路上的大妈也能写wcf了 ...
- 十五天精通WCF——第十四天 一起聊聊FaultException
我们在玩web编程的时候,可能你会不经意的见到一些http500的错误,我想你应该不会陌生的,原因你应该也知道,服务器异常嘛, 这时候clr会把这个未处理的异常抛给iis并且包装成http500的错 ...
- [转]十五天精通WCF——第十四天 一起聊聊FaultException
我们在玩web编程的时候,可能你会不经意的见到一些http500的错误,我想你应该不会陌生的,原因你应该也知道,服务器异常嘛, 这时候clr会把这个未处理的异常抛给iis并且包装成http500的错 ...
- [转]十五天精通WCF——第一天 三种Binding让你KO80%的业务
转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了, 再简单的话马路上的大妈也能写wcf了 ...
- 十五天精通WCF——终结篇 那些你需要注意的坑
终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果 不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧. 一: 第 ...
- 十五天精通WCF——第十三天 用WCF来玩Rest
在我们玩wcf的时候,都会潜意识的觉得wcf就是通过soap协议交换消息的,并且可以在basic,tcp,msmq等等绑定中任意切换, 牛逼的一塌糊涂,但是呢,如果说哪一天wcf不再使用soap协议, ...
- 十五天精通WCF——第十二天 说说wcf中的那几种序列化
我们都知道wcf是由信道栈组成的,在我们传输的参数走到传输信道层之前,先需要经过序列化的过程,也就是将参数序列化为message,这篇 我们就来说说这里的序列化,蛮有意思的,可能初学者也明白,在wcf ...
- 十五天精通WCF——第十一天 如何对wcf进行全程监控
说点题外话,我们在玩asp.net的时候,都知道有一个叼毛玩意叫做“生命周期”,我们可以用httpmodule在先于页面的page_load中 做一些拦截,这样做的好处有很多,比如记录日志,参数过滤, ...
随机推荐
- 小HY的四元组
4.7 比赛T1,然而这题爆零了 其实很简单的...其实哈希都不用 所以首先记录每组的差值,按其sort一下再暴力找即可 #include<cstdio> #include<iost ...
- 【BZOJ4241】历史研究(回滚莫队)
题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本 ...
- python值函数名的使用以及闭包,迭代器
一.函数名的运用 函数名就是一个变量名,但它是一个特殊的变量名,是一个后面加括号可以执行函数的变量名. def func(): print("我是一个小小的函数") a = fun ...
- sql语句优化:用join取代not in
不要太多使用not in查询,最好用表连接来取代它.如: select ID,name from Table_A where ID not in (select ID from Table_B) 这句 ...
- layer实现在前台删除前确认弹出框,并回调后台删除事件
最近遇到一些问题,用layer提示消息框,比如删除时,提示消息确定后 return false时,则不管用了,因为layer不支持阻塞,下面就解决一下这个问题:(本文使用Xcode,如要学习,请复下面 ...
- C#入门经典 Chapter4 流程控制
4.1布尔逻辑 布尔比较运算符 == != < > <= >= 处理布尔值的布尔值运算符 ! & | ^(异或) 条件布尔运算符 &&am ...
- Hive扩展功能(八)--表的索引
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...
- c++ 以二进制和以文本方式读写文件的区别
在c++项目开发中,时常涉及到文件读写操作.因此在这里先简单梳理和回顾一下文本模式和二进制模式在进行文件读写上的区别. 1.linux平台下文本文件和二进制文件的读写 在linux平台下进行文件读写时 ...
- Ubuntu14.4安装mysql
一.安装 apt-get install mysql-server mysql-client 设置用户名和密码 二.检查 sudo service mysql restart 三.支持 1.apach ...
- rxswift-self.usernameTF.rx.text.orEmpty.map
self.usernameTF.rx.text.orEmpty.map 一堆类型转化+数据处理的操作 self.usernameTF.rx:将textfiled用Reactive封装: .text:监 ...