十五天精通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开发中,或多或少的都能接

触的到,希望对你有用~~~~

相关文章
|
缓存 算法 测试技术
|
缓存 网络协议 安全
【计算巢】DNS 解析过程详解:域名如何转换为 IP 地址
【5月更文挑战第31天】DNS(域名系统)将人类可读的域名转换为IP地址,涉及本地DNS缓存、层次化DNS服务器系统,包括根DNS、顶级域名DNS和权威DNS。当查询域名时,通过DNS服务器间的交互找到对应IP并返回给浏览器。Python示例展示了DNS查询过程。尽管DNS面临安全挑战,如欺骗和缓存中毒,采取安全措施可确保其稳定性和安全性。它是互联网的重要基础,连接域名与IP,支持便捷的网络访问。
660 0
|
缓存 算法 Swift
Swift 应用性能优化的重要性及基本原则,包括理解性能瓶颈、针对性优化和平衡性能与代码质量
本文深入探讨了 Swift 应用性能优化的重要性及基本原则,包括理解性能瓶颈、针对性优化和平衡性能与代码质量。具体介绍了优化数据结构、减少对象创建、合理使用缓存、优化算法和内存管理等技巧,并通过实际案例展示了如何有效提升应用性能和用户体验。
311 3
|
UED
【打造梦幻联动!】揭秘钉钉宜搭中的单选关联选项设置与图文展示的魔术 —— 让你的表单瞬间变身智能导游!
【8月更文挑战第7天】随着企业信息化的发展,办公自动化工具如钉钉宜搭成为提高效率的关键。宜搭是一款低代码平台,支持灵活的表单设计与流程管理。以旅行社报名表为例,介绍如何实现单选字段联动图文展示:用户选择目的地后自动显示相关信息。设计上,先创建单选和图文字段,再设置联动逻辑。通过简单的后台配置即可实现动态展示效果,提升用户体验与数据准确性。
654 0
|
监控 安全 网络协议
广域网技术
广域网技术
|
数据采集 缓存 NoSQL
owllook在线小说搜索引擎使用指南
owllook是一个在线小说搜索引擎,其目的是让阅读更简单、优雅,让每位读者都有舒适的阅读体验
24846 0
ENVI_IDL:如何对影像进行各种方式的上下左右的颠倒或者翻转.
ENVI_IDL:如何对影像进行各种方式的上下左右的颠倒或者翻转.
755 0
|
C++ 计算机视觉
【OpenCv • c++】形态学技术操作 —— 顶帽操作与黑帽操作
【OpenCv • c++】形态学技术操作 —— 顶帽操作与黑帽操作
757 0