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

本文关键字:net tcp 地址 方案 包含 集合 | 更新日期: 2023-09-27 18:02:53

我一直有一个问题,我已经研究了几天了。我正致力于将WCF服务转换为使用动态端口,这方面的需求终于出现了。我快到那儿了;然而,我得到错误:

系统。ArgumentException:这个集合已经包含了一个方案为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文件中的端点地址。当我这样做的时候,我遇到了其他的问题,因为我已经把地址注释掉了。

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

我已经解决了关于这个问题的问题。我没有尝试用另一个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);
}