簡體   English   中英

自托管WCF服務的多個實例

[英]Multiple instances of a self hosted WCF service

我們有一個從C#中的控制台應用程序運行的“工作者”服務,為了進行開發,我們始終在運行該服務的單個實例,該實例會提取數據塊並執行一些計算,這些數據塊是由另一個服務提供的(跟蹤剩余多少數據等)

現在,在質量檢查中,我們希望同時(在同一台機器上)運行“工作者”服務的多個實例。但是,一旦啟動第二個實例,我們將獲得異常:

TransportManager使用NetTcpPortSharing服務無法偵聽提供的URI:URI已在服務中注冊。

我們正在使用netTcpBinding,並且端點地址被硬編碼到app.config中,並且保持不變,因此,我假設我們遇到此錯誤。

<services>
    <service behaviorConfiguration="CoreBehavior" name="WorkerService">
        <endpoint address="net.tcp://localhost:8001/WorkerAssignment" binding="netTcpBinding" contract="IWorkerService" bindingConfiguration="CoreTcpBinding"/>
    </service>
</services>
<bindings>
    <netTcpBinding>
        <binding name="CoreTcpBinding" portSharingEnabled="true">
            <security mode="None"/>
        </binding>
    </netTcpBinding>
</bindings> 

申請代碼:

var host = new ServiceHost(typeof(WorkerService));
host.Open();

我們如何為每個實例提供不同的URI,以便至少使端口保持不變?

或如果有不同的方式來運行同一服務的多個實例?

如果您想擁有多個服務實例,而僅擁有一個服務主機就足夠了-只需用ServiceBehaviorAttribute裝飾您的WorkerService

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Percall)] 
public class WorkerService : IWorkerService 
{
  //...service data
}

這將確保對服務的每次調用都將首先創建服務的新實例。 創建服務類的其他方法可以在這里找到

但是,如果您想擁有多個服務主機,那么不可能有兩個將完全相同的URL承載相同服務的服務主機。

另一種情況是,如果您想讓一個服務主機在具有相同基址和自定義uri的多個端點上托管相同服務。 在這種情況下,您可以使用重載的ServiceHost構造函數或研究方法AddBaseAddressAddServiceEndpoint 或者,如果您想從配置文件中執行此操作,則可以使用下面的簡單示例,其中對代碼稍作修改

<service behaviorConfiguration="CoreBehavior" name="WorkerService">
    <endpoint address="WorkerAssignment" binding="netTcpBinding" contract="IWorkerService"/>
    <endpoint address="QAWorkerAssignment" binding="netTcpBinding" contract="IWorkerService"/>
  <host>
    <baseAddresses>
      <add baseAddress="net.tcp://localhost:8001/" />
    </baseAddresses>
  </host>
</service>

使用此配置,您將有兩個服務端點

的net.tcp://本地主機:8001 / WorkerAssignment

的net.tcp://本地主機:8001 / QAWorkerAssignment

Murtaza您說對了,您仍然需要多個實例,問題是如何給不同的端口

替代方法1:對於服務的每個實例:在調用ServiceHost.Open之前,可以將端點添加到服務中

ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService))
WSHttpBinding binding = new WSHttpBinding();
serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, "http://localhost:8000/servicemodelsamples/service/basic");

在上面的代碼中,地址部分對於服務的每個實例可以具有不同的端口。

有關詳細信息,請點擊鏈接

備用2:啟用端口共享

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

您可以定義自己的specific behavior

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, 
                 ConcurrencyMode = ConcurrencyMode.Multiple)]

暫無
暫無

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

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