1. 程式人生 > >移植Windows自宿主WCF服務到Linux/Mono2.8

移植Windows自宿主WCF服務到Linux/Mono2.8

Windows服務是這些後臺程式、後臺服務的正規名詞。Windows服務的執行可以在沒有使用者干預的情況下,在後臺執行,沒有任何介面。通過Windows服務管理器進行管理。服務管理器也只能做些簡單的操作:開始,暫停,繼續,停止。Windows服務的特點:在後臺執行,沒有使用者互動,可以隨Windows啟動而啟動。

後臺服務在Unix/Linux上叫做Daemon,在Linux系統中就包含許多的Daemon。判斷Daemon最簡單的方法就是從名稱上看。Linux下自動啟動的服務都在/etc/rc.d/init.d/目錄下,比如說mysql。如果不想讓一個服務自動執行,把/etc/rc.d/init.d/目錄下的這個服務指令碼移除掉就可以(一定要移除嗎,不可以使用類似Window下的手動啟動?)。

可以操作的狀態:

  • start             啟動服務,等價於服務腳本里的start命令
  • stop             停止服務,等價於副外長指令碼stop命令
  • restart          關閉服務,然後重新啟動,等價於指令碼restart命令
  • reload          使服不重新啟動而重讀配置檔案,等價與服務指令碼的reload命令
  • status           提供服務的當前狀態,等價於服務指令碼的status命令
  • condrestart  如果服務鎖定,則這個來關閉服務,然後再次啟動,等價於condrestart命令

Mono 下的Windows服務叫做mono-service,mono-service

執行.net 1.0 程式集 和用 mono-service2 執行.net  2.0 以上的程式集。mono 2.8已經不支援.net 1的程式了,所以我們現在都是使用mono-service2,命令列說明文件參考http://manpages.ubuntu.com/manpages/lucid/man1/mono-service.1.html

       -d:DIRECTORY
              Use this  option  to  specify  the  working  directory  for  the
              service.  The default is the current directory.

       -l:LOCKFILE


              Specifies the file to use for locking, the default is a filename
              constructed in /tmp based on the name of the program that  hosts
              the service.

       -m:MESSAGE
              Name to show in the syslog.

       -n:NAME
              Use  this  to specify the service to be launched (if the program
              contains more than one service).   The default  is  to  run  the
              first defined service.

       --debug
              Use  this  option to prevent mono-service from redirecting stdin
              and stdout and prevent the program to be sent to the background.
              Equivalent to --no-daemon

       --no-daemon
              Use  this  option to prevent mono-service from redirecting stdin
              and stdout and prevent the program to be sent to the background.
              Equivalent to --debug.

Mono 2.8對wcf的支援也比較好了,這裡的例子就是將Windows下self host的一個wcf服務移植到Linux上。

1、在Window下編寫一個WCF 服務端作為Window服務。我們服務的程式碼結構如下

image

要將.NET程式移植到Mono,我們一般會使用net 應用遷移到Mono 工具 (Moma)檢查下相容性。下面這個專案的檢查結果,看看是不是Mono2.8完美支援WCF。

image

DynIPServiceWS是WCF的windows服務的宿主,我們把程式碼放到Linux下使用MonoDevelop編譯.放到/home/geffzhang/Projects/DynIPServiceWS目錄下,切換到這個目錄,執行命令

mono-service DynIPServiceWS.exe
執行DynIPClient.exe,返回執行結果說明服務已經在執行,如果客戶端出現目標機器積極拒絕說明服務沒有啟動。
mono DynIPClient.exe。