2010-04-02 3 views
3

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

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

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

Я нашел this article на MSDN, который гласит:

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

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

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

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

ответ

2

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

+0

отлично. не могли бы вы добавить ссылку? –

+2

Честно говоря, я не думаю, что у меня есть. Существуют различные сообщения, такие как http://blogs.msdn.com/b/mjm/archive/2006/11/13/auto-open-part-1.aspx, который предоставил мне подсказки, но я не видел того, что явно показывало, как автоматическое открытие исключает одновременные вызовы. Я помню, что намеревался сделать свой собственный пост в то время, но так и не добрался до него. Я добавлю его в свою очередь и отправлю сюда, когда все закончится. –

+0

Не могли бы вы привести пример кода, как создать канал? Я борюсь с той же проблемой, и вызов Open() на ChannelFactory не помогает в моем случае. –

1

Вы можете кэшировать прокси-сервер WCF, но при этом создавать канал для каждого вызова службы - это обеспечит параллелизм, это не очень дорого по сравнению с созданием канала с нуля, и повторная аутентификация для каждого вызова не понадобится , Это объясняется в блоге Wenlong Dong - "Performance Improvement for WCF Client Proxy Creation in .NET 3.5 and Best Practices" (намного лучший источник информации и руководства WCF, чем MSDN).

+1

+1 В соответствии с дополнением в моем вопросе, пулы мой резервный подход , Тем не менее, мне все же хотелось бы узнать обстоятельства, при которых один прокси-сервер может быть успешно совместно использован с параллелизмом. Если я ничего не пропустил, это сообщение в блоге не распространяется на эти обстоятельства. –

Смежные вопросы