透過Web建立本機帳戶-使用WCF+Windows Service為例

透過Web建立本機帳戶-使用WCF+Windows Service為例

架構

image

PS. 這裡為確保WCF Client 與 WCF Service 不在同一台,跨域執行也能成功,下面範例Web Client與WCF+Windows Service分別是在兩台不同主機上執行作業。如果要看WCF Client + WCF Service + WCF Host Windows Service,三位一體都在localhost同一台的實驗範例,請自行上網搜尋,網上多是這種,這裡不談這種。

 

一、建立 WCF 服務

新增一個 WCF服務專案

名為 AccountLib

image

 

Service1.cs 增加一個方法

這裡我們的目標先擺在,整個WCF從服務、裝載到Client都能貫串起來,執行無誤之後,再來針對WCF 服務,加入新增帳號真正的程式碼。

因此這裡我們先只提供簡單的接收與回傳字串,後面我們會再回來補強 Service1.cs 的程式碼功能。


        public string AddLocalUser(string userName,string userPassword){
            return userName + " : " + userPassword;
        }

image

別忘了在 IService1.cs 也要 增加一個額外的 Operation Contract。

image

建置產生dll

可直接執行,會呼叫Visual Studio預設內建裝載及測試用戶端工具,以先確定服務程式碼有無問題。

image

 

內建提供的裝載及測試工具成功,不代表在實際環境OK,請不要太高興!!

以 WCF 編輯器,編輯app.config

選擇主機服務

image

開發時期為了方便測試,基底位址都用 localhost ,實際環境務必改正此習慣。

localhost以 FQDN 或 IP 均可,但建議 FQDN,尤其在有網域的環境。

使用編輯功能把 Server Name 及 Port 都改掉。記得改完要儲存。

image

再次建置執行,確認無誤!

image

因為 WCF Service 要透過承載(Host),才能提供服務,而我們目前還未撰寫裝載程式,故先暫用VS2010內建的WCF服務主機來執行。

(注意由於VS2010所提供的Web主機主要提供程式開發時方便測試用的,極為單純,其上可執行無誤不等於轉移到IIS也可正常執行。)

就這樣先留著讓服務啟動中,不要關掉,因為下一步我們會先寫一個簡單的Client來測試。

 

二、先建一個 WCF Client 來存取 WCF Service,確定服務存取沒有問題

因為Window Form的Client端程式,沒有IIS的羈絆,很多理想都會成功。因此實際會用到這種架構,多半是介面做成Web,但呼叫Windows Service 的 WCF Service 來執行,中間不經IIS。

注意,這個範例是開在另外一台主機上,不與 WCF Service 同台。以確保與實際部署情況相符合。

image

簡單的button + textbox 即可

image

加入服務參考(切記前面步驟產生的WCF Service 要執行中,不要關掉)

image

把WCF Service 服務位址輸入進去

image

可以使用物件瀏覽器查看參考服務提供的相關功能。

image

image

寫個簡單程式碼,測試 AddLocalUser 方法的參數傳遞,及結果取回。

image

執行結果成功無誤。

image

放到IIS上也可正常使用(注意WCF Web Client 部署所在IIS機台與WCF Service機台是在同AD,至於瀏覽端任意機器沒入網域也無妨)

image

接下來正式寫個承載程式裝載它吧!

 

三、建立一個 Windows 的系統服務,來裝載 WCF Service

通常WCF Service與承載的 Windows Service 應該在同一台,故專案與WCF Service開在同一台無妨。

專案名稱為AccountService

image

把 AccountLib.dll 及 System.ServiceModel 都先加入參考。

image

image

image

切換到Service1.cs的程式碼,複寫 OnStart () 及 OnStop() 方法。

image

加入安裝程式(在Service1.cs的設計界面,滑鼠右鍵快捷列)。

image

在ProjectInstaller.cs 的設計界面出現2個物件,依下圖修改部分屬性

serviceInstaller1

image

serviceProcessInstaller1

image

OK,接下來就建置一遍吧!

整體WCF Server端方案內容如下

image

建置完畢,在專案的bin\Debug 下會有個 AccountService.exe的檔案出現,實際部署或備份就是拷貝這裡的資料到處跑就行了。

image

我們把Debug整個資料由專案拉到別的地方,資料夾改名為InstallAccountService。

待會安裝來源就指定這裡的 AccountService.exe。

image

我們要透過 InstallUtil 這個工具指令,把這個名為AccountService.exe 的程式安裝成為Windows 服務的一份子。

從選單進入Visual Studio命令提示字元,省去找路徑的功夫。

image

執行如下指令

image

image

可以在系統服務看到我們自己做的服務了,不過尚未啟動。

image

嘗試啟動,失敗!! 真是晴天劈靂!

image

先把服務移除,再慢慢看原因

移除就是加 –u 參數即可。

image

image

在我們前面所寫的 OnStart() 覆寫方法中並未透過 AddServiceEndpoint 賦予連線URL資訊,網路上有部分範例是直接使用此法,而此法對於三專案合一的開發方式,確實有用;但回到我一開始說的,萬一 WCF Client 不與 Web Service 同台演出時,會在 Client 端加入服務參考時因無法獲取連線資訊而卡關。

image

最主要原因是沒有把WCF Service的連線資訊帶給Windows Service,最簡單的方式就是把 AccountLib 的 app.config 拷貝到 AccountService 專案內就可以了,如此一來服務既可正常啟動,WCF Client加入服務參考時又可正常取得資訊,Windows Service的 OnStart() 內,就只要簡簡單單new一個然後Open()就行了。

這個小細節要注意!!

(可參考這篇文章http://www.codeproject.com/Articles/38160/WCF-Service-Library-with-Windows-Service-Hosting)

image

重建一次,然後比照前面步驟重新安裝服務,之後就能順利啟動。

image

使用 netstat –a 指令,可觀察到我們指定的 9002 埠正在開門營業中。

image

在工作管理員中,可以看到我們自行開發的服務執行中。

image

回到 Web WCF Client測試,由於之前我們已經把localhost這些類似開發用的位址都改掉了,現在不須要做任何更動,與第二步驟測試不同的是 ,原先 WCF Client 呼叫時,是由 VS2010 的 內建裝載程式回應。現在則是堂堂正正由Windows的系統服務來回應,重開機照樣有效!

 

四、充實內容,增強AddLocalUser()功能

要操作帳號,需先加入 System.DirectoryServices 參考。

image

WCF Service 內的 AddLocalUser 程式碼

image

WCF Client 加上2個textbox,以便輸入名稱與密碼。

image

程式碼

image

再次發布到IIS上執行。

image

至於帳號建在哪?當然就是WCF Service 所在的電腦本機帳戶中。

image

 

範例稍作修改,則網域帳號亦可納入管理。