Исключение Client-SideException при правильной работе - программирование
Подтвердить что ты не робот

Исключение Client-SideException при правильной работе

В настоящее время я столкнулся с проблемой, которую я не понимаю. У меня есть wcf-клиент, который вызывает службу wcf через несколько потоков одновременно (как на одном компьютере). Иногда я встречаюсь с известным System.ServiceModel.CommunicationException

"Произошла ошибка при получении ответа HTTP на xxx.Это может быть связано с привязкой конечной точки службы, не использующей протокол HTTP. Это также может быть связано с тем, что сервер HTTP-запроса прерывается (возможно, из-за закрытия службы). Подробнее см. в журналах сервера." ,

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

Запрос очень мал, его просто вызов (int, bool, enum). Запрос содержит ок. 300-500 КБ записей из базы данных MSSQL.

Я искал сотни на сайтах для решения, увеличивал значения тайм-аута, значения буфера, значения размера запроса и ответа на стороне клиента и службы. Я добавил, что атрибуты [DataContract] и [DataMember] отсутствовали. И все равно изменений нет.

Я активировал полное отслеживание, просто чтобы увидеть очень странное поведение:

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

В трассировке я вижу тяжелый, как на этом графике:

enter image description here

Пожалуйста, помогите остановить бесконечный поиск?

Обновление 1:

Я загрузил клиент и сервер config, возможно, это помогает.

Обновление 2:

Мы включили параметр конфигурации для ConnectionLimit (connection = 80), как это было предложено Yahia. В настоящее время кажется, что это решило проблему, но мы по-прежнему пытаемся воспроизвести ошибку.

Обновление 3:

Блин. Через три часа я снова вижу такое же поведение... У нас было другое предложение: как вы можете видеть, мы используем quartz.net в клиенте, начиная с 20 потоков. Работы, выполняемые кварцевым двигателем, подключаются к нашему сервису. Теперь я пытаюсь представить, что произойдет, если, скажем, 7 потоков пытаются подключить службу в одно и то же время.

Обновление 4:

Мы установили параметры tcp в реестре, а также в config. После перезагрузки ничего не изменилось:(

Это были изменения реестра:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - TcpNumConnections = 65534
HKLM\System\CurrentControlSet\Services\Tcpip\Параметры - MaxUserPort = 65534
HKCU\Software\Microsoft\Windows\CurrentVersion\Настройки Интернета - MaxConnectionsPer1_0Server = 20
HKLM\Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTIONSPERSERVER - iexplore.exe = 20
HKLM\Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTIONSPERSERVER - MyClientsExeName.exe = 20

Обновление 5:

Client TraceServer Trace

Обновление 6:

[DataContract]
public class Currency
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Code { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public ForeignNoteDetails ForeignNoteDetails { get; set; }

    [DataMember]
    public CurrencyRates Rates { get; set; }

    [DataMember]
    public PreciousMetallDetails PreciousMetallDetails { get; set; }

    [DataMember]
    public CurrencyType Type { get; set; }
}

[DataContract]
public class ForeignNoteDetails
{
    [DataMember]
    public double CardholderBillingCurrencyCode { get; set; }

    [DataMember]
    public string Country { get; set; }

    [DataMember]
    public string CountryCode { get; set; }

    [DataMember]
    public int CurrencyUnit { get; set; }

    [DataMember]
    public List<string> Notes { get; set; }
}

[DataContract]
public class CurrencyRates
{
    [DataMember]
    public ExchangeRate PurchaseRate { get; set; }

    [DataMember]
    public ExchangeRate SellRate { get; set; }
}

[DataContract]
public class PreciousMetallDetails
{
    [DataMember]
    public string PreciousMetalType { get; set; }

    [DataMember]
    public double Fineness { get; set; }
}

Вызов службы:

        protected IEnumerable<Currency> GetCurrencyLevel(int id, bool netRate = true, RatesCalculationSource ratesSource = RatesCalculationSource.ReutersRates)
    {
        return this.calculationClient.GetCurrencyLevel(new RatesCalculationSetting() { CalculationLevelId = id, CalculateGrossRates = !netRate, Soruce = ratesSource });
    }

Создание клиента:

protected ICalculationServiceClientService calculationClient = IoC.DependencyManager.Resolve<ICalculationServiceClientService>();

Другой вызов службы (работы):

this.calculationClient.DistributeTradingOfficeRatesLevels(branchOfficeLevelId, tradingLevelId);

Если это определено как

void DistributeTradingOfficeRatesLevels(int branchOfficeRatesLevelId, int tradingOfficeRatesLevelId)

Обновление 7:

Exception details

4b9b3361

Ответ 1

Хорошо, это то, что происходит - у вас есть неисправная сетевая карта, которая перегревается через несколько часов, и когда это происходит, она начинает замыкаться, так как ваша клиентская сторона "думает" о том, что сервер был отключен. Конец истории - 100% уверен. где моя щедрость?

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

Ответ 2

Протокол HTTP определяет ограничение на 2 подключения к одному и тому же веб-серверу...

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

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

Другие соответствующие настройки (на стороне клиента) можно найти здесь.

Ответ 3

Я бы предложил проверить 2 балла:

  • "Дросселирование" на сервере, например

    поведение name= "Дросселировано"
             serviceThttttling
               maxConcurrentCalls = "1"
               maxConcurrentSessions = "1"
               maxConcurrentInstances = "1"

  • Не закрытые сеансы WCF - закрываете ли вы все сеансы (клиентский прокси) после использования?
    В моем случае, когда я увеличил все таймауты до максимума, у меня сложилась ситуация, когда после X звонков услуга стала "застревающей". Когда я менял тайм-ауты, я получил исключение, подобное вашему.

Это было несколько лет назад, поэтому я точно не помню. Кроме того, я помню, что я нашел хорошую статью, в которой описано, как и почему нужно изменить режим Service Instance, чтобы помочь решить эту проблему (сеансы).

Ответ 4

Попробуйте включить трассировку на стороне WCF, вы получите подробную информацию о том, что происходит на стороне сервера.

Также иногда канал WCF factory закрывается, когда клиент отправляет большое количество запросов. мы столкнулись с подобной проблемой, когда мы использовали аутентификацию сертификатов с WCF. В этом случае мы разработали RetryPolicy вокруг этой временной ошибки. если мы получим эту ошибку, мы прерываем канал factory, воссоздаем и отправляем снова, а не бросаем исключение.

 while (retryCount <= MAXRETRY)
            {
                try
                {
                    return _proxyService.GetData(); // _proxyService is WCF proxy class
                }
                catch (CommunicationException transientException)
                {
                     if (SLEEPINTERVAL> 0)
                    {
                        Thread.Sleep(SLEEPINTERVAL);
                    }
                    ((IClientChannel) _proxyService).Abort();
                    _proxyService = functionToCreateProxy();
                }

                retryCount++;
            }

Ответ 5

У меня была та же проблема. В моем случае это была моя ошибка. Я закрыл channelFactory (прокси) после запуска потоков.