2009-02-03 37 views
2

我有一個接受雙工TCP連接的WCF聊天服務。一個單一的雙工tcp連接可以用來爲多個用戶發送和接收消息(這樣我就可以有多個聊天服務器,它們都可以相互連接)。將ASP.Net連接到WCF/TCP聊天服務

現在我想將Web用戶添加到混合中,讓他們與桌面用戶聊天。這是一個實時支持類型的東西。基本上我試圖找出從ASP.Net到這個聊天服務的「帶外」通信的最佳方式。

我在想,我可以有一個靜態/全局雙工連接到其中一個聊天服務器,我可以使用它的所有請求到該ASP.Net服務器。這會工作嗎?雙工連接是全部單向通話,我可以使用這個WCF通道而不鎖定對它的訪問嗎?

更新:感謝您的建議到目前爲止。我應該注意到:我的聊天服務是自託管的,它不在IIS中運行。所以,我主要關心的是如何讓IIS保持連接打開,直到應用程序卸載。從Web瀏覽器到IIS的連接將是silverlight,flash,ajax,iframe,任何東西。

回答

1

最好的辦法是在應用程序級別實現雙向消息隊列,由用戶索引消息和會話標識符。然後,您可以根據等待對象彈出並推送應用級WCF服務(又名peer)。進入隊列將需要被鎖定,但這是相對較低的成本。 WCF服務將完成繁重的工作。但是,在某些情況下,如果僅使用一個代理服務器發送消息,我預計該應用會遇到瓶頸問題。在我看來,每個會話擁有一個專用的頻道代理可能會更有效率,從而使事情不那麼有狀態。我也允許非雙工連接,因爲所有消息都是單向操作。

0

這可能不會回答你的問題,但你可能會讓silverlight做到這一點,並使用類似的代碼,您的桌面版使用。

+0

謝謝你,我打算做一個silverlight客戶端我迫不及待想去那個部分:) – 2009-02-03 05:57:19

0

要考慮的一種可能性是將Silverlight 2應用程序作爲Web用戶導航到的ASP.NET頁面的一部分提供。

此Silverlight應用程序可以使用Silverlight 2 SDK附帶的System.ServiceModel.PollingDuplex.dll程序集(one for Silverlight app one for WCF server)中的WCF輪詢雙面支持。

我有一個few blog posts and a sample application演示從一個控制檯應用程序如何「推」股票更新,自我主機有兩個端點的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客戶端連接到相同WCF服務的PollingDuplexHttpBinding端點。該應用程序還顯示瞭如何處理Silverlight客戶端訪問策略要求。

客戶端(Silverlight或WPF)可以在其UI中爲股票添加備註,並將這些備註傳播回服務器以推送給所有其他客戶端。這展示了雙向溝通,並希望執行聊天應用程序所需的大部分必要溝通。

您可以看到demo application running here的屏幕截圖。

+0

我絕對會在通過之前創建一個Silverlight客戶端,但那是從web-客戶端到IIS。我正在努力尋找將IIS連接到我自己託管的服務而無需爲每個Web用戶執行wcf連接的最佳解決方案。 – 2009-02-03 05:55:52

+0

我明白你現在得到了什麼,你已經更新了這個問題。請注意,服務器端不必是使用Silverlight輪詢雙工的IIS。 – 2009-02-03 06:11:49