首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WCF MSMQ 服務動態添加端點無需重啟服務器:Self-Host 與配置熱加載

     編輯:程式設計綜合問答

場景

生產環境已部署 MSMQ WCF 服務,需新增 WCF 客戶端調用,要求**不重啟服務器**、通過配置文件完成。

方案一:WCF Self-Host(獨立進程,熱更新配置)

將 WCF 服務寄宿於 Windows Service / Console App / WPF App 中,而非 IIS/WAS。
優勢:進程完全可控,配置文件 (app.config) 修改後可通過 ServiceHost 重新載入或動態添加端點。

// 動態添加端點示例
var host = new ServiceHost(typeof(MyMsmqService));
var binding = new NetMsmqBinding();
host.AddServiceEndpoint(typeof(IMyContract), binding, "net.msmq://localhost/private/newqueue");
host.Open();

// 配置文件變更監聽
FileSystemWatcher watcher = new FileSystemWatcher(AppDomain.CurrentDomain.BaseDirectory, "app.config");
watcher.Changed += (s, e) => {
    // 重新讀取配置並重建端點(需關閉舊 host 開啟新 host)
    host.Close();
    host = new ServiceHost(typeof(MyMsmqService));
    host.Open();
};
watcher.EnableRaisingEvents = true;

方案二:IIS/WAS + AppDomain 回收(無需重啟服務器)

  • 修改 web.config 觸發應用程序域回收,WCF 服務自動重新載入配置。
  • 操作:保存 web.config 即可,IIS 會優雅回收(現有連接完成後新請求走新配置)。
  • 注意:頻繁回收影響性能,生產環境謹慎。

方案三:標準配置文件熱加載(.NET 4.5+)

<system.serviceModel>
  <bindings>
    <netMsmqBinding>
      <binding name="msmqBinding" />
    </netMsmqBinding>
  </bindings>
  <services>
    <service name="MyService">
      <endpoint address="net.msmq://localhost/private/queue1" binding="netMsmqBinding" bindingConfiguration="msmqBinding" contract="IContract" />
      <!-- 新增端點只需在這裡添加 -->
      <endpoint address="net.msmq://localhost/private/queue2" binding="netMsmqBinding" bindingConfiguration="msmqBinding" contract="IContract" />
    </service>
  </services>
</system.serviceModel>

保存 web.config/app.config 後,WCF 運行時自動偵測變更並應用新端點(需 serviceAutoStartEnabled="true")。

MSMQ 特有注意事項

  • 隊列必須預先創建(MessageQueue.Create(@".\private$\newqueue"))。
  • 權限:服務運行身份需具備隊列 ReceiveMessage/PeekMessage 權限。
  • 事務隊列需 NetMsmqBinding 設置 ExactlyOnce=true、Durable=true。

總結

Self-Host 提供最大靈活性**,適合頻繁動態調整;**IIS + 配置文件熱加載** 適合標準部署流程。兩者均可實現「不重啟服務器(作業系統層面)」,僅回收應用程序域/進程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved