2014-09-19 2 views
1

У меня есть приложение службы WCF, которое успешно запускалось в течение длительного времени.Приложение с именованными трубами, которое раньше работало, неожиданно завершилось с таймаутом

С тех пор как несколько дней все вызовы клиентов терпят неудачу с таймаутом. Я проверил, используя пошаговую отладку, и метод сервера никогда не работает, хотя соединение открыто на стороне клиента.

Частьсервер:

var host = new ServiceHost(typeof(Server.ClientSession)); 
host.AddServiceEndpoint(typeof(Contract.IEngine), 
    new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) 
    { 
     HostNameComparisonMode = HostNameComparisonMode.Exact, 
     MaxReceivedMessageSize = 1000000 
    }, "net.pipe://Engine"); 

    host.Open(); 

Клиентская часть:

engine = new EngineClient(
    new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) 
    { 
     HostNameComparisonMode = HostNameComparisonMode.Exact, 
     MaxReceivedMessageSize = 1000000 
    }, 
    new EndpointAddress("net.pipe://Engine")); 

engine.Actions.Subscribe(); // <= Fails with TIMEOUT 

Где EngineClient класс является оберткой ClientBase<>:

public class EngineClient : ClientBase<IEngine> 
{ 
    public EngineClient(Binding binding, EndpointAddress address) 
     : base(binding, address) 
    { 
    } 

    public IEngine Actions 
    { 
     get 
     { 
      return Channel; 
     } 
    } 
} 

объяснил, это работало месяцами и внезапно разбилось на пару дней.

ответ

0

Я нашел проблему:

Еще один новый WCF службы по тестам запущенного на той же машине, в течение нескольких суток. Он также использовал именованную связь канала по другому адресу, но код сервера пропустил параметр HostNameComparisonMode.

var host = new ServiceHost(typeof(OtherServer.ClientSession)); 
host.AddServiceEndpoint(typeof(OtherContract.IEngine), 
    new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) 
    { 
     /* THE LINE BELOW WAS MISSING */ 
     HostNameComparisonMode = HostNameComparisonMode.Exact, 

     MaxReceivedMessageSize = 1000000 
    }, "net.pipe://OtherEngine"); 

    host.Open(); 

Я полагаю, что эта служба противоречила другим вызовам клиентов. Теперь, когда HostNameComparisonMode был правильно установлен на этой новой службе, все работает нормально.

Смежные вопросы