2009-02-03 4 views
2

У меня есть чат-служба WCF, которая принимает дуплексные соединения tcp. Одноточечное соединение tcp можно использовать для отправки и получения сообщений для нескольких пользователей (поэтому я могу иметь несколько чат-серверов, которые все подключаются друг к другу).Подключение службы чата ASP.Net к Wcf/Tcp

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

Я думал, что у меня может быть статическое/глобальное дуплексное соединение с одним из чат-серверов, и я мог бы использовать его для всех запросов на этот сервер ASP.Net. Будет ли это работать? Дуплексное соединение - это ВСЕ односторонние вызовы, могу ли я использовать этот канал WCF без блокировки доступа к нему?

ОБНОВЛЕНИЕ: Спасибо за ваши предложения. Я должен был отметить: мой чат-сервис сам по себе, он не работает в IIS. Итак, я в основном обеспокоен тем, как я могу заставить IIS открыть соединение до тех пор, пока приложение не выгрузится. Соединение от веб-браузера к IIS будет silverlight, flash, ajax, iframes, что угодно.

ответ

1

Ваш лучший выбор - реализовать двунаправленную очередь сообщений на уровне приложения, индексирование сообщений пользователем и идентификатор сеанса. Тогда вы могли бы использовать сервис WCF на уровне приложения (aka peer) и нажать на основе объектов ожидания. Доступ к очереди должен быть заблокирован, но это относительно низкая стоимость. Служба WCF сделает тяжелый подъем. Однако в какой-то момент я ожидал, что приложение испытает узкие места, если для отправки сообщений используется только один прокси. Мне кажется, что наличие прокси-сервера выделенного канала за сеанс может быть более эффективным, тем самым сохраняя при этом что-то менее состоятельное. Я также разрешаю использовать недуплексные соединения, поскольку все сообщения являются односторонними.

+0

Вы правы. Мне нужно будет сделать двунаправленную очередь сообщений или две отдельные очереди сообщений на одно соединение с дуплексной службой. Я также думал об использовании ReaderWriterLockSlim для защиты POOL от wcfDuplexClients, которые растут и сжимаются и хранятся в статической/глобальной коллекции. –

+0

Каждый wcfDuplexClient в пуле может иметь свою собственную очередь ввода/вывода. Таким образом, я мог бы читать LockWriterLockSlim, захватить wcfDuplexClient, lock (wcfDuplexClient.sendLock) {wcfDuplexClient.Send (myCommand); } и т. д. –

+0

Все еще думает о выделенном канале за сеанс. Это может быть лучшим способом. –

0

Это может не ответить на ваш вопрос, но вы можете использовать Silverlight и использовать аналогичный код, который использует ваша настольная версия.

+0

Спасибо, я планирую сделать клиент silverlight, которого я не могу дождаться, чтобы добраться до этой части :) –

0

Одной из возможностей рассмотрения является подача приложения Silverlight 2 как часть страницы ASP.NET, к которой пользователи веб-сайта переходят.

Это приложение Silverlight может использовать поддержку дуплексной обработки WCF в сборках System.ServiceModel.PollingDuplex.dll (one for Silverlight app one for WCF server), которые поставляются вместе с Silverlight 2 SDK.

У меня есть few blog posts and a sample application, которые демонстрируют, как обновления запасов «Push» из консольного приложения, что сами-хосты WCF сервиса с двумя конечными точками следующим образом: клиенты

using System; 
using System.ServiceModel; 
using System.ServiceModel.Description; 

namespace StockServer 
{ 
    public class StockServiceHost : ServiceHost 
    { 
     public StockServiceHost(object singletonInstance, params Uri[] baseAddresses) 
      : base(singletonInstance, baseAddresses) 
     { 
     } 

     public StockServiceHost(Type serviceType, params Uri[] baseAddresses) 
      : base(serviceType, baseAddresses) 
     { 
     } 

     protected override void InitializeRuntime() 
     { 
      this.AddServiceEndpoint(
       typeof(IPolicyProvider), 
       new WebHttpBinding(), 
       new Uri("http://localhost:10201/")).Behaviors.Add(new WebHttpBehavior()); 

      this.AddServiceEndpoint(
       typeof(IStockService), 
       new PollingDuplexHttpBinding(), 
       new Uri("http://localhost:10201/SilverlightStockService")); 

      this.AddServiceEndpoint(
       typeof(IStockService), 
       new WSDualHttpBinding(WSDualHttpSecurityMode.None), 
       new Uri("http://localhost:10201/WpfStockService")); 

      base.InitializeRuntime(); 
     } 
    } 
} 

WPF подключение к WSDualHttpBinding конечной точке и Silverlight клиенты подключаются к конечной точке PollingDuplexHttpBinding той же службы WCF. Приложение также показывает, как обрабатывать требования политики доступа к клиенту Silverlight.

Клиенты (Silverlight или WPF) могут добавлять примечания к фонду в своем пользовательском интерфейсе, и эти заметки распространяются обратно на сервер, которые будут перенаправлены всем другим клиентам. Это демонстрирует связь в любом направлении и, надеюсь, выполняет большую часть необходимой связи, необходимой для приложения чата.

Вы можете посмотреть скриншот с demo application running here.

+0

Я определенно собираюсь сделать клиент Silverlight до того, как я закончил, но это соединение с веб- клиент для IIS.Я изо всех сил стараюсь найти лучшее решение для подключения IIS к самостоятельному сервису без использования wcf-подключения для каждого пользователя сети. –

+0

Я вижу, что вы получаете, теперь вы обновили вопрос. Обратите внимание, что серверная сторона не должна быть IIS с использованием дуплекса Silverlight. –