集合已包含方案 net.tcp 的地址

Collection Already Contains Address with scheme net.tcp

我有一个长期存在的问题,我已经研究了几天了。我正在研究 t运行sitioning 一个 WCF 服务以使用动态端口,这个需求终于出现了。我大部分时间都在那里;但是,我收到错误消息:

System.ArgumentException: This collection already contains an address with scheme net.tcp.

我在网上搜索了答案,但只找到了方案是http的解决方案。我将提供一些代码,以帮助那些希望帮助我和其他人解决这个问题的人。

我有一个 services.development.config 文件。由于组织内的特定原因,我们将 app.config 文件分开。

<service name="MLITS.Pulse.Pulse" behaviorConfiguration="PulseCSBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:14613/PulseService"/>
      </baseAddresses>
    </host>
    <endpoint name="NetTcpEndPoint"
              address=""
              binding="netTcpBinding"
              contract="MLITS.Pulse.IPulse" />
    <endpoint name="NetTcpMetadataPoint"
              address="mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange" />

我们在 client.development.config 文件中也有端点地址。

<endpoint address="net.tcp://localhost:14613/PulseService" binding="netTcpBinding"
bindingConfiguration="NetTcpEndPoint" contract="PulseService.IPulse" name="NetTcpEndPoint" />

现在我对我使用的方法的理解是,我可以保留这里指定的特定端口号,以后再更改它。现在我更改端口号的方法是将会话 ID 添加到基本端口号(即 14613)。以下代码就是执行此操作的方法。

public static void DynamicAddress()
{
    int sessionIdentification = 0;
    int portNumber = 0;
    int newPort = 0;
    string uriString = string.Empty;

    sessionIdentification = Process.GetCurrentProcess().SessionId;
    portNumber = 14613;
    newPort = portNumber + sessionIdentification;

    uriString = "net.tcp://localhost:" + newPort + "/PulseService";

    //seperate the port from the rest of the service
    //add the session id to the port
    //put the address back together and return it

    Uri uri = new Uri(uriString);

    ServiceHost objServiceHost = new ServiceHost(typeof(Pulse), uri);
}

当我们尝试处理 ServiceHost 行时出现错误。我的问题是:如何解决这个问题,使其正常运行?

请记住,我已经尝试注释掉 services.development.config 文件中的基地址,以及 client.development.config 文件中的端点地址。执行此操作时,我 运行 遇到了其他问题,因为我已将地址注释掉。

我已经解决了关于这个问题的问题。我没有尝试为服务主机分配另一个 URI,而是必须先清除端点,然后添加我的新服务端点。我所做的唯一更改是 DynamicPort 方法。代码如下:

public static void DynamicAddress(
{
    int sessionIdentification = 0;
    int portNumber = 0;
    int newPort = 0;
    string uriString = string.Empty;

    sessionIdentification = Process.GetCurrentProcess().SessionId;
    portNumber = 14613;
    newPort = portNumber + sessionIdentification;

    uriString = "net.tcp://localhost:" + newPort + "/PulseService";

    Uri uri = new Uri(uriString);

    ServiceHost objServiceHost = new ServiceHost(typeof(Pulse));
    objServiceHost.Description.Endpoints.Clear();
    objServiceHost.AddServiceEndpoint(typeof(Pulse), new NetTcpBinding(), uri);
}