2012-02-02 9 views
6

У меня есть приложение Winforms, написанное на C#, которое использует веб-службы с сервера Windows Server 2008 IIS Coldfusion. Все вызовы веб-службы преуспевают, но один, который не работает примерно в 50% случаев со следующей ошибкой:Ошибка при использовании веб-службы: существующее соединение было принудительно закрыто

System.InvalidOperationException не был обработан кодом пользователя Сообщение = В документе XML (1254, 7) есть ошибка.

с внутренним исключением:

InnerException: System.IO.IOException Message = Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным узлом.

Я проверил журналы IIS и получил ошибку 503 (Service Unavailable) и код IIS 64 (указанная сеть больше недоступна). Любые предложения были бы замечательными.

Я бегу мой веб-службу в SOAP UI и я получаю следующее сообщение об ошибке:

javax.net.ssl.SSLException: Соединение было отключение: javax.net.ssl.SSLException: java.net.SocketException: Восстановление соединения

Этот код отлично работает в одной компании, но эта ошибка появляется почти каждый раз для этой компании, с которой я сейчас работаю.

+0

Проверьте журналы событий Windows, особенно журнал приложений. BTW, службы _written_ в Coldfusion? –

+0

В журналах событий нет ошибок или чего-либо еще, что будет связано с этой проблемой. Услуги написаны в Coldfusion. –

+0

Вы связались с продавцом веб-сервиса? Это звучит как проблема с этой целью, не обязательно в потребляющем приложении. –

ответ

0

Я получил аналогичную ошибку, и причиной было исключение в сериализации XML. В основном, если xmlserializer пытается прочитать некоторое свойство, и метод get вызывает исключение из-за того, что соединение с базой данных уже закрыто или какие-либо ресурсы недоступны.

Вы пытались регистрировать исключения в событии с ошибкой внутри global.asax?

Иногда, если global.asax не вызывает событие ошибки, то только способ зарегистрировать ошибку через фильтр ответов. Вы можете добавить фильтр пользовательских ответов в файл web.config, в котором вы сможете проанализировать, насколько XML был правильно сериализован и где он может быть неудачным.

http://msdn.microsoft.com/en-us/library/aa479332.aspx

http://www.raboof.com/projects/elmah/

+0

Что такое global.asax? Это не программа ASP.net. Как мне добавить добавление настраиваемого фильтра ответов в web.config? –

+0

Я добавил соответствующие ссылки –

1

Если вы используете клиент WCF для подключения к службе, включите службы ведения журнала трассировки в клиентском приложении с помощью следующей конфигурации:

<system.diagnostics> 
    <trace autoflush="true" /> 
    <sources> 
     <source name="System.ServiceModel" 
         switchValue="Error" 
         propagateActivity="true"> 
      <listeners> 
       <add name="sdt" 
         type="System.Diagnostics.XmlWriterTraceListener" 
         initializeData= "ErrorTrace.svclog" 
         /> 
      </listeners> 
     </source> 
    </sources> 
</system.diagnostics> 

Скачать окна sdk, и у вас есть хороший просмотрщик трассировки для этих файлов журналов. Это поможет вам разобраться в ошибках в WCF-связи.

+0

К сожалению, я использую WinForms (это более старая программа). Есть ли какие-либо функции трассировки для WinForms? –

+0

Вы все равно можете использовать WCF-клиент из winforms - то есть, если вы находитесь в .NET 3.0 или новее. –

1

Использование кросс-платформенной связи иногда случается (когда-то случилось с моим кодом), что исключение выбрано не настоящее описание того, что происходит внутри.

Одной из причин этого исключения является то, что время отклика немного меньше времени, необходимого для завершения процедуры webservice. Поэтому попробуйте увеличить таймаут в вашем app.config.

Если это не поможет, в вашем случае могут быть две возможные проблемы.

  1. Если используется SSL, возникает проблема с действительностью сертификата SSL.
  2. В XML есть некоторые недопустимые символы, например, ваша платформа не поддерживает символы Юникода, и в XML используется некорректный символ.

Но я надеюсь, что только увеличение таймаута исправит это.

0

Промежуточное соединение «Существующее соединение было принудительно закрыто удаленным хостом» из одного адресата звучит как проблема с сетью для меня.

Попробуйте получить журналы с сервера, к которому вы пытаетесь получить доступ, и от задействованных брандмауэров обоих мест. Вы можете запустить Fiddler или NetMon/WireShark/Ethereal для дальнейшей диагностики.

0

Соединение близко случается при любых обстоятельствах. Убедитесь, что тайм-аут изобилует сервером и клиентом, убедитесь, что в возвращаемых вами данных нет рекурсии. Циркулярная ссылка. Сериализация важна в этом случае, потому что вещь возвращается к сериализации.

Сделайте трассировщик WCF и проверьте ответ. Любая ошибка на сервере закроет соединение. Если сервер требует имя пользователя, убедитесь, что они верны. Позаботьтесь об ошибке SSL. используйте WCF-клиент для тестирования сервиса.

0

Это может быть выстрел в темноте, но вот моя теория:

Первая ошибка происходит на стороне веб-службы с плохим выбросу исключения, может быть, некоторые недостоверные данные быть переходящие в сервис? Это может привести к ошибке, связанной с неправильным формированием XML. Я бы сделал несколько тестовых примеров, чтобы узнать, какие данные передаются в службу и что вызывает проблему.

Вторая ошибка, которую я видел ранее в определенных обстоятельствах в отношении исключения веб-службы, и бросание try, завернутое вокруг оператора using для службы. Эта комбинация логики вызвала ранний выход, который не был очищен.

0

попытаться проверить существующие протоколы в вашей последней компании, и сравнить их с вашей текущей компании, я имею в виду TCP/IP, ...

3

Недавно я получил подобное сообщение, когда потребляющих WCF-WebService. В моем случае это оказалось ошибкой конфигурации на стороне сервера . Может быть, что-то настроено по-другому на одном сервере, где это происходит с вами? Моя проблема заключалась в том, что максимальный размер сообщения по умолчанию был настроен как слишком маленький на сервере, и это привело к такому же принудительному закрытию соединения. Существует максимальный размер сообщения , чтобы избежать атак DOS ...

0

Проверьте конфигурацию утилиты пула приложений в IIS. Я видел эту ошибку, например, когда «Лимит частной памяти» установлен в значение (скажем, 100 Мб), а затем процесс w3wp превышает этот предел, который приведет к повторному использованию пула приложений.

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

Если все соединения не закрыты в пределах предельного времени отключения (обычно 90 секунд), то они уничтожаются IIS, и клиент может поднять сообщение «Существующее соединение было принудительно закрыто».

0

Я не уверен, что это применимо к конкретной ситуации OP, но это может помочь другим, кто прибывает сюда в настоящее время. Одной из потенциальных причин этого исключения являются несогласованные протоколы безопасности. Если сервер, на который вы звоните, требует TLS 1.2, и вы используете более старую версию ASP.net (< = Версия 4.0), вы будете использовать старый протокол безопасности для совершения ваших вызовов, если вы не измените его. Вы можете заставить ASP.net использовать TLS 1.2 (показано ниже). Это можно сделать в любом месте приложения, но я поставил его прямо перед строкой, которая вызывает веб-службу, требующую TLS 1.2:

using System.Net; 

... 

//Enable TLS 1.2 
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; 

// Call the Web Service that requires TLS 1.2