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