## 一: 服務是端點的集合
當你在開發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開發中,或多或少的都能接
觸的到,希望對你有用~~~~
- 第一天 三種Binding讓你KO80%的業務
- 第二天 告別煩惱的config配置
- 第三天 client如何知道server提供的功能清單
- 第四天 你一定要明白的通信單元Message
- 第五天 你需要了解的三個小技巧
- 第六天 你必須要了解的3種通信模式
- 第七天 Close和Abort到底該怎么用才對得起觀眾
- 第八天 對“綁定”的最后一點理解
- 第九天 高級玩法之自定義Behavior
- 第十天 學會用SvcConfigEditor來簡化配置
- 第十一天 如何對wcf進行全程監控
- 第十二天 說說wcf中的那幾種序列化
- 第十三天 用WCF來玩Rest
- 第十四天 一起聊聊FaultException
- 終結篇 那些你需要注意的坑