自託管(Self-Hosting),就是由開發人員提供和管理宿主進程的生命週期。自託管方式適用以下情境:需要確定用戶端與服務端的進程(或機器)邊界時;使用進程內託管,即服務與用戶端處理相同的進程中時。自主控處理序可以是控制台應用程式、Windows應用程式、Windows服務等,進程必須在用戶端調用服務之前運行。
自託管支援通訊的協議包括:HTTP、TCP、IPC、MSMQ。
自託管宿主進程必須在運行時顯示地註冊服務類型,同時為用戶端的調用開啟宿主,因此才要求宿主進程必須在用戶端調用到達之前運行。建立宿主進程的方法通常是在Main() 方法中調用ServiceHost類。
下面我們通過一個DEMO來介紹自託管(Self-Hosting)。
開發環境:Visual Studio 2010 + Net Framework 4.0 。
1、建立一個WCf Service Library,主要代碼如下:
介面契約代碼
namespace ServiceLibrary
{
//ServiceContract為服務契約
[ServiceContract(Namespace = "http://schemas.xinhaijulan.com/demos/SelfHost")]
public interface IHelloWCF
{
//OperationContract為方法契約
[OperationContract]
string GetMessage(string msg);
[OperationContract]
Item TestDataContract(Item item);
}
}
實作類別代碼
namespace ServiceLibrary
{
public class HelloWCF : IHelloWCF
{
public string GetMessage(string msg)
{
return string.Format("The server received message is : {0}", msg);
}
public Item TestDataContract(Item item)
{
if (item != null)
{
item.Name = "item from client is not null.";
}
else
{
item = new Item(0);
item.Name = "item from client is null.";
}
return item;
}
}
}
資料契約代碼
namespace ServiceLibrary
{
[DataContract(Name = "Item", Namespace = "http://schemas.xinhaijulan.com/demos/SelfHost")]
public class Item
{
public Item(int _id)
{
Id = _id;
}
[DataMember(Order = 0)]
public int Id { get; set; }
[DataMember(Order = 1)]
public string Name { get; set; }
}
}
以上為Service Library部分,為了實現啟動服務端,我們需要顯示註冊服務類型。
2、建立Server控制台項目作為託管的進程項目,添加ServiceLibrary引用,主要代碼如下:
namespace Server
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(ServiceLibrary.HelloWCF)))
{
host.AddServiceEndpoint(typeof(ServiceLibrary.IHelloWCF), new NetTcpBinding(), "net.tcp://localhost:9000/HelloWCF");
host.Open();
Console.WriteLine("Please input exit to close host.");
string key = Console.ReadLine();
while (key.ToLower() != "exit")
{
Console.WriteLine("Please input exit to close host.");
key = Console.ReadLine();
}
}
}
}
}
這裡我們通過使用NetTcpBinding綁定,地址為:net.tcp://localhost:9000/HelloWCF,對於綁定與地址我們還可以配置在App.config檔案中。
3、建立Client項目,添加ServiceLibrary引用,前面的項目我們都是通過添加Service 引用來調用服務端,這裡我們通過代碼的方式,來實現調用服務端。
/// <summary>
/// 測試ServiceLibrary
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
ChannelFactory<ServiceLibrary.IHelloWCF> channelFactory = new ChannelFactory<ServiceLibrary.IHelloWCF>(new NetTcpBinding());
ServiceLibrary.IHelloWCF client = channelFactory.CreateChannel(new EndpointAddress("net.tcp://localhost:9000/HelloWCF"));
Console.WriteLine("------------Begin-------------");
Console.WriteLine(client.GetMessage("Hello WCF!"));
ServiceLibrary.Item item = new ServiceLibrary.Item(1);
item = client.TestDataContract(item);
Console.WriteLine("item.Id:" + item.Id);
Console.WriteLine("item.Name:" + item.Name);
Console.WriteLine("------------End---------------");
Console.ReadLine();
}
因服務端使用NetTcpBinding綁定與端點地址:net.tcp://localhost:9000/HelloWCF,因此我們用戶端建立調用對象時使用與服務端相同的綁定協議與地址。
4、啟動服務端,右鍵Server->Debug->Start new instance 如:
5、啟動用戶端,右鍵Client->Debug->Start new instance,輸出如下:
------------Begin-------------
The server received message is : Hello WCF!
item.Id:1
item.Name:item from client is not null.
------------End---------------
至此,本章一個自託管的DEMO介紹完畢,要點如下:
服務端使用Console Application來託管WCF進程ServiceHost;
服務端使用代碼方式實現綁定與端點地址的編寫(也可通過配置方式實現);
用戶端通過代碼方式實現服務端的調用;
用戶端通過代碼方式實現綁定與端點地址的編寫,必須與服務端一致(也可通過配置方式實現);
服務端必須先啟動,用戶端方能調用服務端。
點擊下載DEMO。
作者:心海巨瀾
出處:http:xinhaijulan.cnblogs.com
著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。