十五天精通WCF——第五天 你需要了解的三個小技巧

一線碼農發表於2015-06-14

 一: 服務是端點的集合

  當你在開發wcf的時候,你或許已經注意到了一個service可以公佈多個endpoint,確實是這樣,在wcf中有一句很經典的話,叫做“服務是端點的集合",就

比如說一個普普通通的服務,它就公佈了一個服務端點,一個後設資料端點,對吧。。。

仔細一想,這個問題就好玩了,既然一個service可以公佈多個endpoint,而且我還知道wcf中有很多的binding,這些binding對應著很多的傳輸方式,那是不是

說我一個service可以用多種協議方法對外公佈,比如說同時以nettcp,basic,msmqbinding,udp等方式公佈,對吧,那這樣的話是不是超級好玩,如果對方

是非.net程式,那就可以呼叫我的basic,如果對方是.net程式,那是不是可以呼叫我的nettcp,對不對。。。當然啦,wcf無所不能,這是一個史上無比強大的牛

逼框架,牛逼的要死,已經逼得程式設計師只需隨便改幾個配置就能達到完全不一樣的效果。。。下面我同時用nettcp和basic的方式來同時公佈服務,好了,現在我

們就來見證奇蹟吧。。。

Service:

 1 using System;
 2 using System.Runtime.Serialization;
 3 using System.ServiceModel;
 4 using System.ServiceModel.Channels;
 5 using System.Threading;
 6 
 7 namespace MyService
 8 {
 9     public class HomeService : IHomeService
10     {
11         public Student Update(Student message)
12         {
13             return new Student() { Name = "一線碼農" };
14         }
15     }
16 
17     [DataContract]
18     public class Student
19     {
20         [DataMember]
21         public string Name { get; set; }
22 
23         [DataMember]
24         public int Age { get; set; }
25     }
26 }

Host :

 1     class Program1
 2     {
 3         static void Main(string[] args)
 4         {
 5             ServiceHost host = new ServiceHost(typeof(HomeService), new Uri("http://192.168.1.105:1920"));
 6 
 7             host.AddServiceEndpoint(typeof(IHomeService), new BasicHttpBinding(), "HomeServie");
 8 
 9             host.AddServiceEndpoint(typeof(IHomeService), new NetTcpBinding(), "net.tcp://192.168.1.105:1921/HomeServieTcp");
10 
11             host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
12 
13             host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
14 
15             host.Open();
16 
17             Console.Read();
18         }
19     }

Client端:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //basic 方式
 6             ChannelFactory<IHomeService> factory = new ChannelFactory<IHomeService>(new BasicHttpBinding(),
 7                                                                                     new EndpointAddress("http://192.168.1.105:1920/HomeServie"));
 8 
 9             var client = factory.CreateChannel();
10 
11             var result = client.Update(new Student() { });
12 
13 
14             //nettcp方式
15             factory = new ChannelFactory<IHomeService>(new NetTcpBinding(),
16                                                                        new EndpointAddress("net.tcp://192.168.1.105:1921/HomeServieTcp"));
17 
18             client = factory.CreateChannel();
19 
20             result = client.Update(new Student() { });
21         }
22     }

 

通過上面的程式碼,是不是已經發現,我在client端,既可以用basic的方式呼叫,又可以用nettcp的方式呼叫,這個技巧是不是感覺wcf無比強大呢???

 

二:Host寄宿多個Service

  我們知道wcf的寄宿方式有很多種,有iis,有windowservice,還有簡單方便的console方式,而預設情況下,我們最通常的方法都是一個service,一個寄宿,

而其實呢??? 其實一個寄宿host可以承載多個service,看起來是不是很好玩,如果說你有10個servcie,現在你只需要用一個console host就能寄宿起來,廢

話不多說,我演示一下給你看就好了。

Service:

 1     namespace MyService
 2     {
 3         [ServiceContract]
 4         public interface IHomeService
 5         {
 6             [OperationContract]
 7             Student Update(Student message);
 8         }
 9 
10         [ServiceContract]
11         public interface IFlyService
12         {
13             [OperationContract]
14             Student Fly(Student stu);
15         }
16     }

Host:

 1     class Program1
 2     {
 3         static void Main(string[] args)
 4         {
 5             //第一個: 這是Home服務
 6             ServiceHost host = new ServiceHost(typeof(HomeService), new Uri("http://192.168.1.105:1920"));
 7             host.AddServiceEndpoint(typeof(IHomeService), new BasicHttpBinding(), "HomeServie");
 8             host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
 9             host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
10             host.Open();
11 
12             Console.WriteLine("Home服務開啟。。。。");
13 
14             //第一個: 這是Fly服務
15             var host2 = new ServiceHost(typeof(FlyService), new Uri("http://192.168.1.105:1930"));
16             host2.AddServiceEndpoint(typeof(IFlyService), new BasicHttpBinding(), "FlyServie");
17             host2.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
18             host2.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
19             host2.Open();
20 
21             Console.WriteLine("Fly服務開啟。。。。");
22 
23             Console.Read();
24         }
25     }

有沒有看到,現在兩個服務都開啟了,這種方式看起來是不是很爽呀,否則的話,你需要開啟兩個Host,這樣的話,我的手續就精簡了。。。對吧。。

 

三: Tcp中的埠共享

   這玩意聽起來大家都懂,埠共享嘛,不就是兩個程式共享一個埠,對吧,在通常情況下,我們肯定會認為這無法做到,其實呢?在Wcf中我們還是可以玩

的,也就是一個PortSharingEnabled的事!!!如果說埠可以共享的話,那我們的service是不是就可以少開闢幾個埠呢?同樣這也方便我們進行service的管

理,下面我給大家繼續演示一下。。。很好玩的,麼麼噠

 

可以看到,我的兩個host都是用1920的埠,並且現在我真的開啟起來啦。。。。好了,三種技巧都說到了,我想你在現實的wcf開發中,或多或少的都能接

觸的到,希望對你有用~~~~

 

相關文章