WCF自宿主管理進(jìn)程聲明周期
WCF中的宿主是一個(gè)非常重要的內(nèi)容。對(duì)于初學(xué)者來(lái)說(shuō),可能對(duì)此的理解掌握并不是太容易。我們將會(huì)在這篇文章中通過(guò)低WCF自宿主的解讀,來(lái)讓大家進(jìn)一步的對(duì)WCF宿主的內(nèi)容有一個(gè)深入了解。#t#
WCF自宿主是當(dāng)開(kāi)發(fā)者負(fù)責(zé)提供和管理宿主進(jìn)程的生命周期時(shí)使用的技術(shù)名詞。自宿主被應(yīng)用在位于客戶端和服務(wù)之間的一個(gè)進(jìn)程(或計(jì)算機(jī))邊界環(huán)境中,以及當(dāng)使用進(jìn)程中服務(wù)的情況下(也就是說(shuō),與客戶端處于相同的進(jìn)程中)。你需要提供的進(jìn)程可能是任何Windows進(jìn)程,例如,一個(gè)Windows表單應(yīng)用程序,一個(gè)控制臺(tái)應(yīng)用程序或一個(gè)Windows NT服務(wù)。注意,該進(jìn)程必須在客戶端調(diào)用服務(wù)之前先運(yùn)行起來(lái);典型情況下,這意味著,你必須預(yù)先啟動(dòng)它。對(duì)于NT進(jìn)程中服務(wù)來(lái)說(shuō)這并不是一個(gè)問(wèn)題。
類似于IIS宿主,WCF自宿主應(yīng)用程序配置文件必須列出你想宿主的服務(wù)的類型并且暴露給外界。而且,該宿主進(jìn)程必須在運(yùn)行時(shí)刻顯式地注冊(cè)服務(wù)類型并且打開(kāi)該宿主以便于客戶端調(diào)用。典型地,這是在Main()方法中使用如下定義的助理類ServiceHost實(shí)現(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ù)類型和(可選)默認(rèn)的基地址。該基地址集可以是一個(gè)空集(以后,你可以配置不同的基地址)。擁有一組基地址能夠使服務(wù)接受在多個(gè)地址和協(xié)議上的調(diào)用。注意,每個(gè)ServiceHost實(shí)例都關(guān)聯(lián)與一個(gè)特定的服務(wù)類型,并且如果宿主進(jìn)程需要宿主多個(gè)類型的服務(wù)的話,你需要一些匹配的ServiceHost實(shí)例。通過(guò)調(diào)用宿主中的ServiceHost.Open()方法,你允許調(diào)入(call- in);并且通過(guò)調(diào)用ServiceHost.Close()方法,你可以體面地退出宿主實(shí)例并完成到當(dāng)前客戶端的數(shù)據(jù)發(fā)送,并且還要拒絕未來(lái)的客戶端調(diào)用-即使宿主進(jìn)程仍在運(yùn)行中。典型地,關(guān)閉操作是在宿主進(jìn)程關(guān)閉時(shí)實(shí)現(xiàn)的。例如,為了把這個(gè)服務(wù)宿主在一個(gè)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();
- }
注意,你可以在調(diào)用ServiceHost.Open()之后攔截調(diào)用,因?yàn)樵撍拗鹘邮赵诠ぷ髡呔€程上的所有調(diào)用。對(duì)ServiceHost.Open()的調(diào)用將加載WCF運(yùn)行時(shí)刻并且支持接收客戶端調(diào)用。該宿主能注冊(cè)多個(gè)基地址,只要它們至少在傳輸方面存在不同:
- Uri tcpBaseAddress = new Uri("net.tcp://localhost:8001/");
- Uri httpBaseAddress = new Uri("http://localhost:8002/");
- ServiceHost serviceHost = new ServiceHost(typeof(MyService),
tcpBaseAddress,httpBaseAddress);
通過(guò)從"Add New Item"對(duì)話框中選擇WCF服務(wù),Visual Studio 2005允許你把一個(gè)WCF服務(wù)添加到任何應(yīng)用程序工程。以此方式添加的服務(wù)當(dāng)然是進(jìn)程中服務(wù)(相對(duì)于宿主進(jìn)程來(lái)說(shuō)),但是也可以由外部客戶端存取。
以上就是對(duì)WCF自宿主的全部介紹。