2013-12-13 2 views
0

«WCF Service не может быть использована для связи, поскольку он находится в поврежденном состоянии»Где закрыть соединение WCF службы в MVC

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

public void CloseChannels() 
    { 
     bool success = false; 
     foreach (ChannelFactory li in factoryList) 
     { 
      try 
      { 
       if (li.State == CommunicationState.Opened) 
        li.Close(); 
       li.ToString())); 
       success = true; 
      } 
      catch (Exception ex) 
      { 
       Helpers.Logger.Log.Error("Could not close connection for the service",ex); 
      } 
      finally 
      { 
       if (!success) 
       { 
        if (li.State == CommunicationState.Opened) 
         li.Abort(); 
       } 
      } 
     } 
    } 

Я должен называть это для каждого каждого вызова службы, чтобы убедиться, что соединение закрыто. Есть ли глобальное место в ASP.NET MVC, где я могу назвать это? (например, в веб-формах ASP.NET у нас было событие OnUnload страницы)

+0

Как насчет блока 'using' всякий раз, когда вы используете канал? – TGlatzer

ответ

1

У вас есть три или больше возможностей для решения проблемы:

Используйте используя
Всякий раз, когда вы используете службу сделать это внутри с помощью блока.

using (var serviceClient = new ServiceClient()) 
{ 
    serviceClient.DoSomething();  
} 

Используйте интерфейс IDisposable (Контроллер реализует его) Инъекции инъекции Использование зависимостей

public override void Dispose() 
{ 
    _myServiceClient.Dispose(); 
} 

Использование зависимостей
и жизни менеджер, который делает срок службы контроллера и обслуживания клиентов действует то же, что и http-запрос.

+0

На самом деле я выбрал комбинацию 1-го и 2-го вариантов. В моем классе «Service Factory», который создает все службы, я сделал его одноразовым, реализуя интерфейс IDisposable и назвал метод закрытого канала внутри него. – Dhanuka777

+0

Я бы предпочел называть Dispose() на таких объектах, но это, вероятно, не имеет значения в конце. (Фактически для 'ClientBase ' 'Dispose()' вызывает 'Close()') – TGlatzer

2

Когда я вызываю свои методы wcf, я всегда использую «using», после чего он будет закрывать и удалять объект после его использования.

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