ASP.NET -> проблема параллелизма WCF

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

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


person pistacchio    schedule 20.04.2009    source источник


Ответы (4)


Я подозреваю, что вы включили [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, вы можете попробовать использовать режим aspsessionstate SQLServer. которые могут не показывать такое же поведение блокировки.

person LukeSkywalker    schedule 11.07.2013

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

  • правильно ли удаляются/закрываются клиенты после звонков?
  • ваша услуга за вызов, одиночный или за сеанс?
  • пробовали ли вы использовать Fiddler или другой инструмент трассировки для перехвата вашего http-трафика?
person boj    schedule 20.04.2009

Ну, если предположить, что проблема не в параллелизме БД или аппаратном обеспечении веб-сервера, вот что можно попробовать... В 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>
person XDecker    schedule 10.09.2009

Если уровень 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;
person Wiktor Zychla    schedule 11.07.2013