ASP.NET -> проблема параллелизма WCF - PullRequest
0 голосов
/ 20 апреля 2009

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

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

Ответы [ 4 ]

1 голос
/ 11 июля 2013

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

Либо вам не нужен Session, и отключение 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 будет препятствовать записи в сеансы без исключения. Записанные значения будут возвращены как нулевые.

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

0 голосов
/ 11 июля 2013

Если уровень 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;
0 голосов
/ 10 сентября 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>
0 голосов
/ 20 апреля 2009

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

  • правильно ли распоряжаются / закрываются клиенты после звонков?
  • это ваша услуга за звонок , синглтон или за сеанс ?
  • вы пробовали Fiddler или другой инструмент трассировки, чтобы поймать ваш трафик http?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...