转自http://www.dotblogs.com.tw/maxi/archive/2010/07/07/16440.aspx
透過WCF,可以把程式與程式之間的通訊簡化.這裡會用Named pipe去做Inter Process Communication.WCF是把通訊統一化的工具,所以不用擔心通訊方法,理論上做一些小修改就可變換通訊方法.
要建立通訊,共分開三個部份: 訂立合約, 建立服務, 使用服務.
首先來建立服務合約, 其實就是定一個interface作為溝通協議, 首先建立一個library專案, 加入System.ServiceModel參考.
using System.ServiceModel;
namespace Wcf.Test
{
[ServiceContract]
public interface IService
{
void IsCalled(string message);
}
}
這樣就定好一個簡單的合約, 然後在服務提供端和使用端都加入這個library的參考就可以.
接下來建立服務提供端. 這裡我們會使用Named pipe作為溝通方法, 首先需要按照合約實作服務
namespace Wcf.Test
{
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyService : IService
{
public void IsCalled(string message)
{
// do something
}
}
}
然後在程式執行時,啟動服務.
string l_serviceAddress = "net.pipe://yourHostAddress";
m_Service = new ServiceHost(typeof(MyService), new Uri[] { new Uri(l_serviceAddress) });
m_Service.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "CallMe");
m_Service.Open();
通訊類型就是根據你的字串來建立的,named pipe是"net.pipe://", yourHostAddress例如可以是IP,或者localhost,請參考MSDN的說明.注意!建立ServiceHost時要傳遞的是Service Class的名稱,加入Service Endpoint時傳遞的卻是合約名稱. named pipe要配合NetNamedPipeBinding()來使用.最後的參數是你想給服務的名稱.然後用Open()啟動服務.
最後來使用這一項服務.
string l_serviceAddress = "net.pipe://serviceHostName/CallMe";
ChannelFactory<IService> l_factory = new ChannelFactory<IService>(new NetNamedPipeBinding(), new EndpointAddress(l_serviceAddress));
IService l_Service = l_factory.CreateChannel();
try
{
l_Service.IsCalled("Message");
}
catch (EndpointNotFoundException epnfex)
{
//write event log. do nothing
}
Service address跟建立Service host時一樣,後面再加上服務名稱,也就是上面設定的"CallMe", 使用服務時不用實作合約,也不需要知道host的實作型別,只需要用合約介面建立一個factory,再從factory產生出使用服務的channel,接下來就跟一般method call沒有分別.記得要處理EndPointNotFoundException.