Розетки Vs. WCF - PullRequest
       15

Розетки Vs. WCF

6 голосов
/ 24 июня 2009

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

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

Поэтому мне нужно знать следующее:

  1. Кажется, что вся связь, использующая WCF, основана на методах, открытых клиентским callind из моей службы WCF. Есть ли способ узнать, какой клиент вызывает определенный метод? Это очень важно для моего приложения.

  2. Уведомляет ли WCF мое приложение, когда клиент отключается (например, закрывает окно браузера, в котором работает клиент Silverlight) от сервера? Это тоже очень важно.

  3. Являются ли вызовы методов полностью асинхронными? Если да, нужно ли перенаправлять каждый вызов метода в основной поток серверного приложения?

  4. У каждого клиентского соединения есть свой собственный поток? Сколько одновременных подключений может обработать сервер (работающий на ПК с разумной мощностью), если клиенты вызывают методы каждые 2 секунды? Мне просто нужна оценка (10, 100, 1000 или даже больше). «Больше» было бы здорово;)

Возможно, я совершенно не прав, и WCF вообще не работает на основе соединений. Тогда мне нужно будет найти обходной путь для управления списком активных соединений.

Спасибо за вашу помощь! Андрей

Ответы [ 3 ]

4 голосов
/ 25 июня 2009
  1. Поскольку вы используете приложение Silverlight, вы можете внедрить валидатор UserNamePassword на уровне сообщений, который добавляет некоторые заголовки к сообщению мыла, что может использоваться для уникальной идентификации клиентов, если клиенты не являются анонимными. тогда вы можете использовать System.ServiceModel.OperationContext.Current, когда вам нужно получить доступ к имени пользователя в другом месте службы wcf.

  2. Сервер не уведомляется, когда клиент отключается, поскольку сообщения по умолчанию «PerCall», есть способ, использовать класс Singleton в качестве ur ServiceContract с InstanceContextMode.Single, затем реализовать OperationContract с сервисом обратного вызова. затем, когда клиенты входят в службу ur, они должны зарегистрироваться в службе обратного вызова, затем служба обратного вызова может затем переключаться между подключенными клиентами и проверять состояние обратного вызова, независимо от того, открыт он или нет, в конце концов удалить записи, где соединения закрыты, в конце концов. Вы можете получить необходимую вам функциональность.

  3. Асинхронные вызовы от клиента, т.е. в Silverlight все вызовы веб-сервисов являются асинхронными, как в ASP у вас есть выбор, WCF автоматически обрабатывает асинхронные функции, поэтому вам не нужно ничего перенаправлять, просто закодируйте ServiceContract как отдельный поток, и все будет хорошо

  4. Внедрите двоичное кодирование сообщений в silverlight 3, чтобы получить максимальную отдачу от вашего сервера и его пропускной способности, silverlight не поддерживает необработанные tcp-соединения, его следует пересылать в http-сообщении по очень веским причинам. У каждого клиента может быть много одновременных вызовов (помните асинхронно), поэтому для простоты просто подумайте, как если бы сервер назначал отдельный поток для каждого вызова сообщения. Итак, чтобы ответить на ваш вопрос о том, что вы только что сказали, 1000.

0 голосов
/ 25 июня 2009

Мои ответы:

  1. Да. Все общение основано на методах вызова.
  2. В общем - нет.
  3. Вы можете вызывать методы синхронно или асинхронно. Это ваш выбор.
  4. Подробнее. Я случай правильного проектирования системы.
0 голосов
/ 24 июня 2009

Для 3 я знаю, что вы можете позвонить асинхронно.

И для 4 да, у них есть свои темы. WCF довольно «БОЛЬШОЙ» и сложный, вам нужна книга, чтобы лучше понять его.

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