百寶箱教你解決WCF自宿主問題
經(jīng)過長時間學習WCF,對WCF也有一定程度上的認識了解,這里就發(fā)表下我的言論吧。WCF自宿主是當開發(fā)者負責提供和管理宿主進程的生命周期時使用的技術(shù)名詞。自宿主被應(yīng)用在位于客戶端和服務(wù)之間的一個進程(或計算機)邊界環(huán)境中,以及當使用進程中服務(wù)的情況下(也就是說,與客戶端處于相同的進程中)。
#T#你需要提供的進程可能是任何Windows進程,例如,一個Windows表單應(yīng)用程序,一個控制臺應(yīng)用程序或一個Windows NT服務(wù)。注意,該進程必須在客戶端調(diào)用服務(wù)之前先運行起來;典型情況下,這意味著,你必須預(yù)先啟動它。對于NT進程中服務(wù)來說這并不是一個問題。類似于IIS宿主,WCF自宿主應(yīng)用程序配置文件必須列出你想宿主的服務(wù)的類型并且暴露給外界。而且,該宿主進程必須在運行時刻顯式地注冊服務(wù)類型并且打開該宿主以便于客戶端調(diào)用。典型地,這是在Main()方法中使用如下定義的助理類ServiceHost實現(xiàn)的:
- public interface ICommunicationObject : IDisposable
- {
- void Open();
- void Close();
- //更多成員
- }
- public abstract class CommunicationObject :
- ICommunicationObject
- {...}
- public class ServiceHostBase : CommunicationObject,...
- {...}
- public class ServiceHost : ServiceHostBase,...
- {
- public ServiceHost(Type serviceType,
- params Uri[]baseAddresses);
- //更多成員
- }
提供給ServiceHost的構(gòu)造函數(shù)的信息有:服務(wù)類型和(可選)默認的基地址。該基地址集可以是一個空集(以后,你可以配置不同的基地址)。擁有一組基地址能夠使服務(wù)接受在多個地址和協(xié)議上的調(diào)用。注意,每個ServiceHost實例都關(guān)聯(lián)與一個特定的服務(wù)類型,并且如果宿主進程需要宿主多個類型的服務(wù)的話,你需要一些匹配的ServiceHost實例。通過調(diào)用宿主中的ServiceHost.Open()方法,你允許調(diào)入(call- in);并且通過調(diào)用ServiceHost.Close()方法,你可以體面地退出宿主實例并完成到當前客戶端的數(shù)據(jù)發(fā)送,并且還要拒絕未來的客戶端調(diào)用-即使宿主進程仍在運行中。典型地,關(guān)閉操作是在WCF自宿主進程關(guān)閉時實現(xiàn)的。例如,為了把這個服務(wù)宿主在一個Windows表單應(yīng)用程序中:
- [ServiceContract]
- interface IMyContract
- {...}
- class MyService : IMyContract
- {...}
- 你可以編寫:
- public static void Main()
- {
- Uri baseAddress = new Uri("http://localhost:8000/");
- ServiceHost serviceHost;
- serviceHost = new ServiceHost(typeof(MyService),baseAddress);
- serviceHost.Open();
- //能夠攔截調(diào)用:
- Application.Run(new MyForm());
- serviceHost.Close();
- }