2014年6月3日 星期二

Windows Services結合WCF呼叫

Windows Services可以常駐於背景,結合WCF後會開啟一個socket供client端呼叫,
建置時Services端要先建好,否則client端會呼叫不到,
先建立服務專案,C# -> Windows -> Windows服務

編寫一些程式碼,這邊用一個文字檔紀錄,主要部分
namespace Service_with_WCF
{
    public partial class ServicePart : ServiceBase
    {
        protected override void OnStart(string[] args)
        {
            StreamWriter sw = new StreamWriter(@"C:\log.txt");
            sw.WriteLine("服務啟動  " + DateTime.Now.ToString());
            sw.Close();
        }
    }
}
服務必須被"安裝"之後才能執行,加入一個服務安裝類別

屬性設置,依個人喜好,Visual Studio有說明提示


加入WCF部分,注意:是新增在服務底下的新項目,不是新增專案

WCF加入後會有一個介面(Interface)類別,一個實體類別以及app.config
介面定義了外部要呼叫的方法名稱,以下為主要部份
namespace Service_with_WCF
{
    [ServiceContract]
    public interface IWCF_Service
    {
        [OperationContract]
        string DoWork(string name);
    }

    public class WCF_Service : IWCF_Service
    {
        public string DoWork(string name)
        {
            return "Hello" + name;
        }
    }
}
app.config最重要的部分在於"呼叫位置",系統會自動產生,其他部分依情況修改
 <add baseAddress="http://localhost:8732/Design_Time_Addresses/Service_with_WCF/WCF_Service/" />

加入一個安裝專案佈署此服務

在服務類別宣告ServiceHost物件,其實就是WCF物件
namespace Service_with_WCF
{
    public partial class ServicePart : ServiceBase
    {
        protected override void OnStart(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(WCF_Service));
            host.Open();

            StreamWriter sw = new StreamWriter(@"C:\log.txt");
            sw.WriteLine("服務啟動  " + DateTime.Now.ToString());
            sw.Close();
        }
    }
}

安裝專案的自訂動作 -> 應用程式資料夾 -> 加入輸出,把剛剛做的服務加進來

建置,佈署,第一次要手動啟動服務,
可以看到剛剛建立的ExampleService已經成功佈署完成

加入Client端的新專案,這邊用主控台應用程式,
專案 -> 加入服務參考 -> 輸入服務位置就可以看到剛剛佈署的Host

撰寫Client端程式碼,宣告一個服務的Client
namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceReference1.WCF_ServiceClient serviceClient = new ServiceReference1.WCF_ServiceClient();
            string resultStr = serviceClient.DoWork(" Sean");
            Console.WriteLine(resultStr);

            Console.Read();
        }
    }
}

成功的呼叫了服務端的方法