AspNetCompatibilityRequirements заставляет веб-службу WCF блокировать

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

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)]
public class AjaxTestWCFService : IAjaxTestWCFService

Однако, если я установил

aspNetCompatibilityEnabled="true"

в web.config, независимо от того, что я делаю, с concurrencymode, usesynchronizationcontext или контекстным режимом экземпляра или даже serviceThrottling config, он, как представляется, выполняет каждый вызов веб-службы последовательно, при этом он принимает 2 минуты для всех 10 запросов вернуться!!

Теперь я понимаю, что это может быть из-за сеанса, но, по крайней мере, в службах ASMX мне удалось установить allowession на false. И на самом деле мой метод веб-службы вообще не использует сеанс. Поэтому вы можете задаться вопросом, зачем вообще использовать aspNetCompatibilityEnabled. Потому что я хочу использовать олицетворение ASP.NET и проверку подлинности форм.

Я даже установил

[ServiceContract(SessionMode=SessionMode.NotAllowed)]

Итак, мой вопрос: это по дизайну и как я могу разрешить одновременные запросы веб-сервисов с включенной совместимостью ASP.net?

Ответ 1

Это сама разработка ASP.NET - проверьте параллельные запросы и состояние сеанса. Когда вы включаете AspNetCompatibilityEnabled, вам всегда приходится иметь дело с этим - я не пробовал, но я ожидаю, что единственным вариантом может быть отключить сеанс в файле конфигурации.

<configuration>
  <system.web>
    <sessionState mode="Off" />
  </system.web>
</configuration>  

Но ваш тест, вероятно, не очень реалистичен. Когда параметр AspNetCompatibilityEnabled выключен, он будет выполняться параллельно локально, но я ожидаю, что если вы запустите страницу с другого компьютера, вы не сможете выполнить более двух запросов параллельно. Причина в том, что по умолчанию используется постоянное соединение HTTP. По спецификации HTTP только 2 HTTP-постоянные соединения могут быть открыты на том же сервере = могут выполняться только два параллельных запроса (последний абзац до главы 8.2). Windows выполняет следующие рекомендации.

Edit:

Этот поток на форуме MSDN вызывает ту же проблему. Это также дает некоторое решение.