2009-12-10 5 views
1

У меня есть служба WCF, которая вызывается из моего приложения Silverlight 3 (с C#). Услуга вызывается для каждого элемента в заполненном пользователем списке. Когда в списке есть только один элемент, все работает нормально. Несколько элементов вызывают ошибку иногда. Я немного тестировал, и иногда я получаю сообщение об ошибке с двумя пунктами, иногда нет. С 4-мя пунктами теста, один раз я получаю 2 результата, после которых ошибка.Ошибка при быстром вызове службы WCF

Хуже всего то, что ошибка просто говорит: «Remoteserver вернул ошибку: NotFound». Ошибка является «CommunicationException» и выбрасывается в результате (System.IAsyncResult) EndMethod метод

Вот вызов:

foreach (ListBoxItem lbItem in categorySeeds) 
{ 
    Helper.Instance.service.ClusterAsync(Helper.Instance.language.value, 
    ((KeyValuePair<string, int>)lbItem.Tag).Value, 
    Helper.Instance.clusterLevel, 
    Helper.Instance.clusterDelay, 
    Helper.Instance.clusterTolerance, 
    Helper.Instance.clusterMaxCategories, 
    Helper.Instance.similarity); 
} 

Я помню, что когда-то «решить» проблему путем вызова «повторного использования» из AppPool, который содержал мой WCF ... так что, возможно, что-то не так с конфигурацией? Кто-нибудь знает, смогу ли я сделать WCF более значимым сообщение об ошибке, чем просто «NotFound»?

Спасибо заранее, Frank

ОТВЕТ: Проблема была вызвана одновременным доступом нескольких WCF-Сервис-вызовов. Служба вызывает StoredProcedures, которые работают с объектами Synonym, которые каждый SP изменяется на значение, заданное параметром ... поэтому я должен его исправить.

ответ

2

Сервер WCF будет иметь максимальное количество одновременных вызовов и одновременных сеансов, которые равны соответственно 10 и 16. Если вы вызываете эту услугу слишком быстро с большим количеством вызовов, вы можете получить отсрочку и/или сообщения.

Это поведение службы (serviceThrottling), который действительно настраивается на сервере:

<serviceBehaviors> 
    <behavior name="YourServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
     <serviceThrottling 
      maxConcurrentCalls="25" 
      maxConcurrentInstances="25" 
      maxConcurrentSessions="25"/> 
    </behavior> 
</serviceBehaviors> 

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

<serviceBehaviors> 
    <behavior name="YourServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
    </behavior> 
</serviceBehaviors> 
+0

Описанная проблема должна быть довольно распространенной, конечно же, решение состоит не в том, чтобы заниматься дросселированием? Клиент не будет просто так просто открывать так много соединений с одним и тем же сервером, что, несомненно, поставит на очередь такие запросы на клиенте и будет иметь только несколько одновременных запросов. Кроме того, OP иногда описывает проблемы с двумя записями, поэтому я не могу понять, как поможет изменение дроссельной заслонки. Я подозреваю, что подробные исключения покажут код serveride, который неправильно обрабатывает параллелизм нескольких вызовов. – AnthonyWJones

+0

Ты абсолютно прав, Энтони. У меня уже было свойство serviceDebug на месте, но при потреблении WCF с Silverlight 3 вам нужно немного поработать, чтобы действительно получить ошибку: http://msdn.microsoft.com/en-us/library/dd470096(VS .96) .aspx. Получив это на месте, я обнаружил, что ошибка вызвана одновременным доступом к SQL-StoredProcedures с помощью WCF-сервиса. Я использую синоним для запроса разных таблиц, имеющих одну и ту же структуру. Но это еще одна история ... * вздох * – Aaginor

2

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

using (TempConvertService TMPConSvc = 
new TempConvertService.TempConvertServiceClient()) 
{ 
result = TMPConSvc.ConvertToF(32.00); 
return result; 
} 
Смежные вопросы