Я тестирую свой сайт под нагрузкой. Сайт вызывает службу WCF, работающую на том же компьютере, с использованием clientCredentialType = "Windows". Все работает до тех пор, пока я не достигну определенной нагрузки (которая даже не очень высока), затем я получаю следующую ошибку:
System.ServiceModel.Security.MessageSecurityException: The HTTP request was forbidden with client authentication scheme 'Anonymous'. ----> System.Net.WebException: The remote server returned an error: (403) Forbidden.
При каждом звонке создаю канал:
var proxy = (IClientChannel)channelFactory.CreateChannel();
В случае успеха закрываю:
proxy.Close();
В случае ошибки я прерываю:
proxy.Abort();
Есть идеи, что происходит? Что я могу сделать, чтобы лучше справляться с нагрузками? Что искать?





Является ли ваша служба сеансовой или вы не беспокоитесь о сохранении состояния между вызовами? Если у вас нет состояния, вы можете пометить свою службу как службу PerCall. Это гарантирует, что экземпляр службы существует только тогда, когда выполняется клиентский вызов.
Эту тему освещает глава 4 превосходной книги Джувала Лоуи «Программирование служб WCF», 2-е издание.
По умолчанию это PerSession, что может быть не тем, что вам нужно.
Также см. Это в MSDN: Как сделать: Создание экземпляров службы управления
Спасибо, Терри. Нет, моя служба не поддерживает состояние. Я пробовал украсить свой класс обслуживания:
[ServiceBehaviorAttribute(InstanceContextMode = InstanceContextMode.PerCall)]
Нет помощи. Точка отказа составляет примерно 4 одновременных вызова.
Это даст нам знать, если есть проблема в том, как у вас настроены вещи, или проблемы с вашим сервисом. Знаешь что я имею ввиду?
Проблема заключалась в том, что я запускал тест на своем устройстве для разработки, которым является XP, который использует IIS 5, который имеет ограничение в 10 подключений.
Какую работу выполняет ваша служба WCF? Еще вы можете попробовать имитировать свой сервис. Используйте тот же интерфейс, но не используйте фактический служебный код. Посмотрите, есть ли у вас похожая проблема. Если нет, добавьте в службу Thread.Sleep для имитации происходящего.