2015-07-15 7 views
0

У меня есть постоянная проблема, которую я изучаю уже пару дней. Я работаю над переходом службы WCF для использования динамического порта, для этого, наконец, понадобилась необходимость. Я больше всего люблю это; Однако, я получаю сообщение об ошибке:Уже созывается Адрес с помощью схемы net.tcp

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" /> 

Теперь это мое понимание с помощью метода я использую, я в состоянии сохранить определенный номер порта, указанный здесь, а затем изменить его. Теперь, когда я меняю номер порта, я добавляю идентификатор сеанса к номеру базового порта (который будет 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. При этом я столкнулся с другими проблемами, связанными с тем, что я прокомментировал адрес.

ответ

0

Я решил проблему, которую я имел в отношении этого вопроса. Вместо того, чтобы пытаться назначить хост службы другим 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); 
}