2009-04-20 2 views
0

Я разрабатываю приложение на основе Ajax, которое активно использует вызовы сервера для уровня WCF, который взаимодействует с БД. Всякий раз, когда я воздействую с клиента (страницы ASP.NET) на многие вызовы в течение короткого промежутка времени на основные службы WCF, система зависает и переходит в состояние ожидания.ASP.NET -> проблема параллелизма WCF

Как я могу справиться с такими проблемами параллелизма? Спасибо.

ответ

0

Без вашей конфигурации трудно помочь, но

  • клиенты расположены/Chanell закрыты правильно после звонков?
  • ваша служба за вызов, одноплодной или за сеанс?
  • Вы пробовали Fiddler или другие инструменты трассировки, чтобы поймать ваш трафик http?
0

Ну, если предположить, что проблема заключается не в БД параллелизм, или аппаратное обеспечение веб-сервера, связанные, вот кое-что попробовать ... WCF имеет некоторые дросселирования значения по умолчанию, которые вызвали подобную проблему с одним из моих приложений. Значения по умолчанию было очень низким (что-то вроде 20 одновременных вызовов/сессий/экземпляров) Добавьте следующие строки в конфигурацию:

<!--add a behavior to modify the throttling --> 

<behaviors> 
<serviceBehaviors> 
<behavior name="LessThrottlingBehavior"> 
<serviceThrottling 
     maxConcurrentCalls="100" 
     maxConcurrentSessions="100" 
     maxConcurrentInstances="100" 
     /> 

    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<!-- modify the service to point to this behavior --> 

<services> 
<service name="MyWCFServer.WCFServer" behaviorConfiguration="LessThrottlingBehavior"> 
</service> 
</services> 
1

Я подозреваю, что вы включили [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] в вашем .svc и Web.config

Либо вам не нужен сеанс, либо отключите AspNetCompatibilityRequirements, чтобы решить вашу проблему.

Возможно, вам это нужно ReadOnly, поэтому вы можете изменить SessionStateBehavior для конкретного svc в Global.asax.cs. Последовательная блокировка остановится.

protected void Application_BeginRequest(object sender, EventArgs e) { 
    if (Request.Path.Contains("AjaxTestWCFService.svc")) { 
     HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly); 
    } 
} 

Имейте в виду, однако, что SessionStateBehavior.ReadOnly предотвратит запись на заседания, не бросать исключение. Письменные значения будут возвращены как null.

Если вам действительно нужно сеанс чтения/записи в вашем сервисе WCF, вы можете попробовать использовать SQLServer aspsessionstate mode, который не может выставлять одно и то же поведение блокировки.

0

Если уровень WCF передается по протоколу HTTP, возможно, вы попадаете в максимальное количество исходящих соединений, которые использует уровень HTTP.

http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

Значение по умолчанию в среде сервера 10, что означает, что может быть не более 10 одновременных исходящих соединений с сервером приложений на уровне WCF. Просто измените это значение на любое большее, в зависимости от предполагаемого количества одновременных вызовов WCF.

В частности, поместить это в Application_Start в переднем веб-приложения (тот, который вызывает службы WCF, а не один с WCF услуг):

System.Net.ServicePointManager.DefaultConnectionLimit = 200; 
Смежные вопросы