使用WCF - Named Pipe去做IPC

  • 10032
  • 0

透過WCF,可以把程式與程式之間的通訊簡化.這裡會用Named pipe去做Inter Process Communication.WCF是把通訊統一化的工具,所以不用擔心通訊方法,理論上做一些小修改就可變換通訊方法.

透過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.

My WP Blog with english technical docs.