Решить проблемы блокировки при одновременном вызове нескольких методов в службе WCF из Silverlight - PullRequest
3 голосов
/ 13 июля 2010

Я только что прочитал эту интересную статью, касающуюся одновременного вызова нескольких методов в службе WCF из Silverlight:

http://weblogs.asp.net/olakarlsson/archive/2010/05/20/simultaneously-calling-multiple-methods-on-a-wcf-service-from-silverlight.aspx

В статье говорится: "Оказывается,проблема основана на сочетании Silverlight, Asp.Net и WCF, в основном, если вы делаете несколько вызовов веб-службе single WCF и у вас включено состояние сеанса Asp.Net, вызовы будутбудет выполняться службой последовательно, поэтому любые длительные вызовы будут блокировать последующие. "

Я предполагаю, что блокировка является проблемой только в том случае, если вы делаете несколько вызовов на один и тот же 1013 * и что два одновременных вызова двух разных методов в двух разных службах не должны приводить к блокировке одного другого?

Предлагаемое решение проблемы в SL3 предполагает использование следующего синтаксиса в методе Application_Startup:

WebRequest.RegisterPrefix ("http://", WebRequestCreator.ClientHttp);

TЗатем необходимо поддерживать состояние сеанса для вызовов WCF, настроив контейнер cookie и передав его всем прокси-серверам (см. http://forums.silverlight.net/forums/p/174322/393032.aspx)

. Это все еще рекомендуемое решение в Silverlight 4?Кто-нибудь использовал альтернативный подход?

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

В .NET 4 вы можете сделать это в Application_BeginRequest

if (Context.Request.Path.EndsWith("xxx.svc"))
   Context.SetSessionStateBehavior(SessionStateBehavior.Disabled);
3 голосов
/ 13 июля 2010

Если вы делаете вызов в приложение ASP.Net и используете сеансовые куки-файлы, то все вызовы в приложение сериализуются (кроме тех, где страница явно отключается от сеанса).состояние).

Обычно это не является большой проблемой, потому что клиентский браузер обычно обращается к странице ASP.Net плюс куча ресурсов (изображения, js, css и т. д.), и эти последние не сопоставлены с ASP.Net , поэтому IIS обслуживает их изначально.Но если вы попытаетесь открыть две страницы ASP.Net одновременно (например, в наборе фреймов), вы увидите, что они загружаются одна за другой.

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

В ASP.Net вы можете «отказаться» от состояния сеанса постранично.Если это возможно для размещенной службы WCF и жизнеспособно для вашего сценария (чтобы сделать службы не сохраняющими состояние), это могло бы облегчить проблему.Или переместите одну или несколько служб в другое приложение ASP.Net (другой сеанс)

Помните, что здесь вы можете увидеть другие проблемы, связанные с моделями создания и повторного входа в службу.Ваша проблема, как описано выше, является проблемой параллелизма для каждого пользователя, но есть и другие.Например, если вы установите службу как одноэлементную (InstanceContextMode.Single) и не реентерабельную (ConcurrencyMode.Single), то будет обрабатываться только один запрос за один раз для всех пользователей.

Обновление : чтение некоторых документов:

  • Службы WCF не регистрируются в сеансах ASP.Net, если вы не попросите об этом (используя)
  • Службы WCF могут на основе на службу подписываться с использованием атрибута [AspNetCompatibilityRequirements] в реализации службы
  • Похоже, нет никакого способа включить, но не включить сеансstate.

На сайте Wenlong Dong

есть хороший пост в блоге. Итак, из того, что я вижу, вы сможете использовать AspNetCompatibilityRequirementsMode.NotAllowed toполностью отказаться от отдельных услуг из служб ASP.Net.В качестве альтернативы, оставьте его выключенным по умолчанию и включайте только те из них, которым необходим доступ к сеансу ASP.Net (учитывая, что если вам действительно не нужно совместно использовать один и тот же сеанс с ASP.Net, просто использование служб сеансов WCF, вероятно,лучше поспорить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...