Существующее соединение было принудительно закрыто удаленным хостом - WCF

У меня есть веб-сервис WCF, который работает нормально. Однако есть один конкретный вызов, который терпит неудачу - но терпит неудачу только для определенных пользователей. Вызов довольно прост - это вызов для получения списка объектов Person.

Для пользователя А это работает нормально. Служба запрашивает базу данных, создает список объектов Person и возвращает его обратно вызывающему приложению.

Для пользователя B это не удается. Странная вещь в том, что, когда я делаю отладку, сервис работает нормально. Он может запрашивать базу данных, создает объект List и возвращает его. Сам сервис никогда не выходит из строя. Но клиентское приложение получает сообщение об ошибке "Существующее соединение было принудительно закрыто удаленным хостом".

Мне кажется, что-то происходит, когда сервисный уровень пытается упаковать данные в формате XML для отправки обратно вызывающему приложению. Я думаю, что это должно быть проблема, связанная с данными, потому что вызов отлично работает для других пользователей. Я визуально посмотрел на данные, и я не вижу ничего странного. Можно предположить, что данные для пользователя B содержат некоторые скрытые символы или что-то в этом роде, что приводит к неожиданному закрытию службы. Что-то вроде того.

Есть идеи?

11 ответов

Лучшее, что я нашел для диагностики подобных вещей, это средство просмотра трассировки сервисов. Это довольно просто настроить (при условии, что вы можете редактировать конфиги):

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

Надеюсь это поможет.

У меня была эта проблема, потому что у моего веб-сайта не было сертификата, привязанного к порту SSL. Я думал, что упомяну это, потому что я нигде не нашел этот ответ в сети Google, и мне потребовались часы, чтобы понять это. Ничего не появилось в программе просмотра событий, что было совершенно потрясающе для диагностики. Надеюсь, это спасет кого-то еще от боли.

Я видел это однажды. Пользователи запрашивают разные объемы данных? Я обнаружил, что даже если вы можете настроить привязку для данных полезных нагрузок (т.е. maxReceivedMessageSize), httpRuntimemaxRequestLength превосходит настройку WCF, поэтому, если IIS пытается обслужить запрос, превышающий этот, он демонстрирует такое поведение.

Думайте об этом так:

Если maxReceivedMessageSize 12MB в вашем поведении WCF, и maxRequestLength 4 МБ (по умолчанию), IIS выигрывает.

Я обнаружил, что вы можете получить эту ошибку, если возвращенный объект имеет только автоматические свойства getter, которые инициализируются в конструкторе (с синтаксисом C# 6.0).

Я полагаю, что это связано с десериализацией объектов WCF на стороне клиента с использованием конструктора без параметров, а затем с настройкой свойств объекта. Это должно иметь set доступно (это может быть приватно) для заполнения объекта, иначе это не удастся.

Я только что имел эту ошибку сейчас только на сервере, и решение было установить maxItemsInObjectGraph атрибут в wcf web.config под <behavior> тег:

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Я поймал то же исключение и нашел InnerException: SocketException. в трассировке svclog.

После просмотра в журнале событий Windows я увидел ошибку, исходящую из System.ServiceModel.Activation.TcpWorkerProcess учебный класс.

Размещаете ли вы свою службу wcf в IIS с помощью netTcpBinding и совместного использования портов?

Кажется, есть ошибка в функции совместного использования портов IIS, проверьте исправление:

Мое решение - разместить службу WCF в службе Windows.

В моем случае это было также с сериализацией. Мне нужно добавить [KnownType(typeof(...)]для всех классов, которые могут появиться в сериализации.

После того, как я потянул за 6 часов эту совершенно бесполезную ошибку, моя проблема закончилась тем, что моя data transfer objects были слишком сложными. Начните с Uber простых свойств, таких как public long Id { get; set;} это все... ничего особенного.

У меня та же проблема. Мое решение таково:

Если вы используете LinQ2SQL в своем проекте, откройте файл dbml в Visual Studio и измените режим сериализации на "Однонаправленный" на

У меня была проблема с сериализацией. Причиной были некоторые из моих классов DTO/ бизнес, и свойства были переименованы или удалены без обновления ссылки на службу. Я удивлен, что не получил contract filter mismatch error вместо. Но обновление службы ref исправило ошибку для меня (та же ошибка, что и для OP).

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

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

Другие вопросы по тегам