Ошибка использования веб-службы: существующее соединение было принудительно закрыто - PullRequest
7 голосов
/ 02 февраля 2012

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

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

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

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

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

Я запускаю свой веб-сервис в интерфейсе SOAP и получаю следующую ошибку:

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

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

Ответы [ 10 ]

3 голосов
/ 27 октября 2017

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

using System.Net;

...

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

// Call the Web Service that requires TLS 1.2
3 голосов
/ 11 февраля 2012

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

1 голос
/ 08 февраля 2012

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

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

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

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

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

1 голос
/ 07 февраля 2012

Если вы используете клиент 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>

Загрузите Windows SDK, и у вас есть хороший просмотрщик трассировки для этих файлов журнала. Это поможет вам разобраться с ошибками в коммуникации WCF.

0 голосов
/ 08 января 2016

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

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

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

0 голосов
/ 10 февраля 2012

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

0 голосов
/ 09 февраля 2012

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

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

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

0 голосов
/ 09 февраля 2012

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

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

0 голосов
/ 09 февраля 2012

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

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

0 голосов
/ 05 февраля 2012

Я получил похожую ошибку, и причиной была исключительная ситуация при сериализации 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...