本文將向大家介紹如何托管內部WCF服務和公共WCF服務
為了托管內部WCF服務
需要建立一個內部端點
並使用內部角色通信
與在輸入端點上托管一個外部服務最主要的區別是內部端點不具有負載均衡特性
而輸入端點是掛鉤在負載均衡器上的
具有負載均衡功能
托管內部WCF服務
其實要托管一個內部WCF服務很簡單唯一需要注意的是傳遞給 ServiceHost 的基地址不同因為端口號和IP地址要等到運行時才知道因此需要創建一個主機動態地傳遞這些信息給它
public override bool OnStart()
{
// 設置最大並發連接數
ServicePointManager
DefaultConnectionLimit =
;
DiagnosticMonitor
Start(
DiagnosticsConnectionString
);
// For information on handling configuration changes
// see the MSDN topic at
RoleEnvironment
Changing += RoleEnvironmentChanging;
StartWCFService();
return base
OnStart();
}
private void StartWCFService()
{
var baseAddress = String
Format(
net
tcp://{
}
RoleEnvironment
CurrentRoleInstance
InstanceEndpoints[
EchoService
]
IPEndpoint
);
var host = new ServiceHost(typeof(EchoService)
new Uri(baseAddress));
host
AddServiceEndpoint(typeof(IEchoService)
new NetTcpBinding(SecurityMode
None)
echo
);
host
Open();
使用內部WCF服務
我想從我另一個托管的服務調用這個服務下面就是調用這個服務的所有代碼
protected void Button
_Click(object sender
EventArgs e)
{
var factory = new ChannelFactory<WorkerHost
IEchoService>(new NetTcpBinding(SecurityMode
None));
var channel = factory
CreateChannel(GetRandomEndpoint());
Label
Text = channel
Echo(TextBox
Text);
}
private EndpointAddress GetRandomEndpoint()
{
var endpoints = RoleEnvironment
Roles[
WorkerHost
]
Instances
Select(i => i
InstanceEndpoints[
EchoService
])
ToArray();
var r = new Random(DateTime
Now
Millisecond);
return new EndpointAddress(
String
Format(
net
tcp://{
}/echo
endpoints[r
Next(endpoints
Count()
)]
IPEndpoint)
);
}
這裡唯一要注意的是查詢F abric 確定 WorkerHost 角色中實現了 EchoService 端點並隨機給它們路由請求的所有端點本來不需要路由請求我這樣做是因為內部端點沒有負載均衡功能我希望在每個 WorkerHost 實例上均勻地分配負載
我發現一個技巧就是不需要緩存你找到的 IPEndpoint 因為它已經緩存在API調用中但根據最佳實踐你應該緩存你的 ChannelFactory
托管公共WCF服務
托管公共WCF服務也很簡單唯一需要注意的是要使用一個新的行為為MEX端點處理負載均衡此外在你的服務上需要包括一個類屬性處理地址過濾不匹配問題
From:http://tw.wingwit.com/Article/os/xtgl/201311/9094.html