Параллельные звонки WCF через общий канал - PullRequest
3 голосов
/ 02 апреля 2010

У меня есть веб-уровень, который перенаправляет вызовы на уровень приложения. Для этого веб-уровень использует общий кешированный канал. Указанные службы уровня приложения не имеют состояния и имеют параллельный доступ.

Но они не вызываются одновременно.

Если я изменяю веб-уровень для создания нового канала при каждом вызове, то я делаю получаю параллельные вызовы на уровне приложения. Но я хочу избежать этой стоимости, поскольку она функционально не нужна для моего сценария. У меня нет состояния сеанса, и при этом мне не нужно повторно проходить проверку подлинности вызывающего абонента каждый раз. Я понимаю, что создание фабрики каналов намного дороже, чем создание каналов, но все же это цена, которую я хотел бы избежать, если это возможно.

Я нашел эту статью на MSDN, в которой говорится:

Хотя каналы и клиенты созданы каналы потокобезопасны, они может не поддерживать написание более одно сообщение в провод одновременно. Если вы отправляете большие сообщения, особенно если потоковая передача операция может заблокировать ожидание еще один отправить для завершения.

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

Может кто-нибудь пролить свет на это?

Приложение. Я также рассматриваю возможность создания пула каналов, которые веб-сервер использует для выполнения запросов. Но опять же, я не вижу причин, по которым мой существующий подход должен блокироваться, и я бы предпочел избежать сложности, если это возможно.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2010

После долгих раздумий все это сводилось к тому, что я не вызывал Open явно на канале перед его использованием. Очевидно, неявный Open может исключать параллелизм в некоторых сценариях.

1 голос
/ 14 октября 2010

Просто для полноты: вот запись в блоге, объясняющая наблюдаемое поведение сериализации запросов при явном открытии канала:

http://blogs.msdn.com/b/wenlong/archive/2007/10/26/best-practice-always-open-wcf-client-proxy-explicitly-when-it-is-shared.aspx

1 голос
/ 03 апреля 2010

Вы можете кэшировать прокси WCF, но при этом создавать канал для каждого вызова службы - это обеспечит параллелизм, не очень дорого по сравнению с созданием канала с нуля, и повторная аутентификация для каждого вызова не потребуется. Это объясняется в блоге Wenlong Dong - «Повышение производительности при создании клиентского прокси WCF в .NET 3.5 и передовой опыт» (гораздо лучший источник информации и рекомендаций WCF, чем MSDN).

...