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

Мы наблюдаем очень необычное поведение при вызове службы WCF. Проблема в том, что иногда это работает, а затем иногда мы получаем следующую ошибку (все внутренние исключения вместе взятые):

Произошла ошибка при отправке HTTP-запроса к. Это может быть связано с тем, что сертификат сервера неправильно настроен с HTTP.SYS в случае HTTPS. Это также может быть вызвано несоответствием привязки безопасности между клиентом и сервером.

Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка.

Невозможно записать данные в транспортное соединение: существующее соединение было принудительно закрыто удаленным хостом.

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

Мы выяснили следующий случай: Сервисный вызов работает нормально при повторении его несколько раз с интервалом в 1 секунду. Затем после ожидания в течение 2-3 минут возникает исключение, которое продолжает возникать долгое время (мы этого не определили). После того, как он заработает, всю процедуру можно повторить, чтобы снова получить исключение.

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

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

//Function on the server that fails *sometimes*
public ConfigurationSaveStatus SaveBathroom(BathroomConfiguration bathroom);

//Function that never fails
public UpdateInfo[] GetUpdates(string xml, string langauge, System.DateTime lastUpdateCheckDate);

//Interface:
public enum ConfigurationSaveStatus {...}

public class BathroomConfiguration
{
    public string BathroomNumber { get; set; }
    public DateTime ConfigurationDate { get; set; }
    public Version ClientVersion { get; set; }
    public bool ScenarioReady { get; set; }
    public bool ScenarioActivated { get; set; }
    public string LicenseXml { get; set; }
    public byte[] ConfigurationReportPdf { get; set; }
    public string Configuration { get; set; }
    public string eToolMac { get; set; }
}

public class UpdateInfo
{
    public int Id { get; set; }
    public string Version { get; set; }
    public string Category { get; set; }
    public string SubCategory { get; set; }
    public int Priority { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string FileLocation { get; set; }
    public long FileSize { get; set; }
    public DateTime ValidFrom { get; set; }
    public DateTime? ValidTo { get; set; }
}

//config
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IeAssistService" closeTimeout="00:01:00"
                        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                        allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                                                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="Transport">
                        <transport clientCredentialType="Basic"/>
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IeAssistService"
                contract="IeAssistService" name="BasicHttpBinding_IeAssistService" />
        </client>
    </system.serviceModel>
</configuration>

person Dejan Dular    schedule 02.09.2014    source источник
comment
Когда начнут приходить исключения, попробуйте iisreset на сервере. Все запросы по-прежнему терпят неудачу, или некоторые из них снова начинают работать, а затем через некоторое время запросы снова перестают работать?   -  person pero    schedule 02.09.2014
comment
Мы выяснили, что это проблема межсетевого экрана. Запрос вообще не доходит до сервиса.   -  person Dejan Dular    schedule 02.09.2014


Ответы (1)


Это было немного сложно.

Сначала мы выяснили, что брандмауэр блокирует запрос. В шлюзе Microsoft Forefront Threat Management Gateway использовался вход по сертификату с резервным входом по имени пользователя и паролю.

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

Как только мы отключили вход по сертификату, все стало нормально.

person Dejan Dular    schedule 02.09.2014