Как мне отладить этот веб-сервис WCF? («ServiceChannel находится в состоянии Failed») - PullRequest
2 голосов
/ 04 сентября 2011

У меня странная ошибка в веб-службе, из-за которой веб-служба становится недоступной. Он вернет ошибку

Объект связи, System.ServiceModel.Channels.ServiceChannel, нельзя использовать для связи, поскольку он находится в состоянии Failed.

Когда я обновляю пул приложений, ошибка исчезает. Я уже добавил несколько журналов отладки (используя Log4net), но они не показывают никакой полезной информации.

В журнале событий тоже ничего нет.

Как успешно отладить этот веб-сервис (который работал более 2 лет и вдруг начинает возвращать эти ошибки)?

Это в C # / .NET 3.5.

Обновление: веб-служба просто извлекает данные с сервера sql (данные клиента), упаковывает их в набор данных и отправляет обратно клиенту.

* Обновление 2: * Кажется, я обнаружил ошибку: клиент не закрывал соединение. Это правдоподобно?

Ответы [ 3 ]

3 голосов
/ 04 сентября 2011

Вы можете добавить ведение журнала службы, используя функциональность System.ServiceModel.MessageLogging, предоставляемую платформой.Он будет регистрировать все внутренние исключения WCF, которые обычно происходят на более высоком уровне, чем контракт на обслуживание, поэтому вы можете никогда не увидеть его при стандартной отладке.

После регистрации ошибки можно проверить созданный файл .svclog.и проанализирован вручную с помощью Service Trace Viewer Tool

Эта функция помогла мне решить проблемы WCF, в которых невозможно определить основную причину на основе информации об исключении, доступной клиенту или серверу.Например, у меня возникла проблема с учетными данными, которая просто вызвала сообщение об исключении в виде строки «Соединение было закрыто удаленным узлом» на клиенте, и на сервере вообще не было никаких исключений.Просматривая журналы на сервере, выявляли точную проблему менее чем за 3 минуты.

Добавьте следующее в ваш app.config / web.config (измените в соответствии с вашими потребностями).Это возможно только через конфигурацию, то есть не требуется программирования для его настройки.

<system.diagnostics>
  <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
                 <add name="messages"
                 type="System.Diagnostics.XmlWriterTraceListener"
                 initializeData="c:\logs\messages.svclog" />
          </listeners>
      </source>
    </sources>
</system.diagnostics>

<system.serviceModel>
  <diagnostics>
    <messageLogging 
         logEntireMessage="true" 
         logMalformedMessages="false"
         logMessagesAtServiceLevel="true" 
         logMessagesAtTransportLevel="true"
         maxMessagesToLog="3000"
         maxSizeOfMessageToLog="2000"/>
  </diagnostics>
</system.serviceModel>

Более подробную информацию можно найти здесь

1 голос
/ 04 сентября 2011

Это может быть проблема с сетевым подключением.Взгляните здесь

Может ли быть так, что ваш сервис слишком долго реагирует?Тот факт, что он работал в течение 2 лет, может означать, что у вас слишком много данных, и ваша служба больше не может запрашивать их достаточно быстро.

Если вы можете запустить его на каком-нибудь локальном компьютере, это может помочь, еслиВы устанавливаете инструмент мониторинга tcp / ip и видите точный запрос (и ответ, если получите его).

Если это веб-сервис SOAP, попробуйте запустить его через SoapUI.

Просто некоторые мысли.

0 голосов
/ 04 сентября 2011

Если вы можете отлаживать на сервере - или подключить удаленный отладчик - попробуйте отключить «просто мой код» в Сервис -> Параметры -> Отладка и прервать все исключения (CTRL-D, E). Вы должны быть в состоянии перехватить все внутренние исключения, которые выдает WCF.

Но ваш комментарий о том, что клиент не закрывает соединения, звучит правдоподобно. Существует ошибка в реализации IDisposable () в ClientBase (см. http://ardalis.com/idisposable-and-wcf).

...