簡體   English   中英

重新啟動由C#控制台應用程序托管的WCF服務

[英]Restart a WCF service hosted by a C# console application

我有一個托管在ac#控制台應用程序上的WCF服務。 有沒有一種方法可以重新啟動此服務,最好通過在服務本身中調用一個端點(例如myService.Restart())。

謝謝

當我執行遠程WCF服務的自動更新時,我必須做類似的事情。 在您的Restart()方法中,關閉主機:

    try
    {
        host.Description.Endpoints.Where(x => !x.Address.ToString().EndsWith("MEX")).ForEach(endpoint => _log.InfoFormat("Closing {0}", endpoint.Address));
        host.Close(TimeSpan.FromSeconds(5));
    }
    catch (Exception)
    {
        host.Abort();
    }

我等待更新應用,成功或失敗后,我將使用最初啟動主機時使用的相同代碼重新打開主機。

如果您只想立即重新啟動,則可以調用host.Open(),也可以設置一個計時器來調用它,等等。

try
{
    host.Open();
    host.Description.Endpoints.Where(x => !x.Address.ToString().EndsWith("MEX")).ForEach(endpoint => _log.InfoFormat("Host opened at: {0}", endpoint.Address));
}
catch (Exception ex)
{
    _log.Error("Unable to open host.", ex);
}

為了回答我的問題,我通過執行以下操作解決了該問題:

  • 將將DLL文件從WCF服務代碼加載到另一個類庫項目的代碼分開
  • 創建一個與在新項目中加載DLL文件的方法簽名相同的方法簽名的接口(兩個項目現在都使用此接口)
  • 在Web服務中,將另一個項目加載到新的應用程序域中。 這樣,DLL文件將被新的應用程序域而不是默認域鎖定。

如果要立即更新nunit DLL文件,我要做的就是從Web服務中卸載應用程序域,更新文件,最后創建一個新的應用程序域。

AppDomain remoteDomain = AppDomain.CreateDomain("New Domain");
IClass1 class1 = (IClass1)remoteDomain.CreateInstanceFromAndUnwrap(
                           "Test1.dll", "Test1.Class1");

注意:IClass1是項目之間的通用接口。

您肯定無法通過調用同一服務本身來“重啟”故障服務。 理論上,您可以在同一過程中托管2個服務。 將您要“重新啟動”的變量放在公共靜態變量中,然后在其他服務中重新啟動它。 問題在於如果出現故障,將重新啟動重新啟動器服務... :),您肯定要對重新啟動器服務進行“類似管理員的限制”,以便未經授權的用戶無法執行此操作。

這有點麻煩,但是我想您可以在服務上公開宿主可以附加的回調,並在觸發時采取適當的措施。 那將使您的主機能夠決定“重新啟動”的真正含義以及如何執行它。 更重要的是,它使您可以決定是否應該執行某些極端的操作,例如從監視程序進程中派生出來,然后關閉自身,還是從容地丟棄並重新實例化您的服務(首選)。

嗯.........

您不能要求服務重新啟動。 考慮具有重新啟動功能的Windows服務(在Windows提供的容器中托管的服務)。 這里,RESTART功能不是由服務提供的,而是由容器提供的。 容器控制如何停止服務並啟動它。

同樣,在您的情況下,如果容器可以提供所需的功能,則應嘗試尋找選項。 由於要遠程控制它,因此該容器也應該是遠程可用的,如果該容器是控制台應用程序,則不可能。 相反,它必須是另一個Web服務或Web應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM