我有一个接受双工tcp连接的WCF聊天服务。单个双工tcp连接可用于为多个用户发送和接收消息(因此我可以将多个聊天服务器相互连接)。
现在我想将Web用户添加到组合中,让他们与桌面用户聊天。这是一个实时支持型的东西。基本上我正试图找出从ASP.Net到这个聊天服务进行“带外”通信的最佳方式。
我原以为我可以与其中一个聊天服务器建立静态/全局双工连接,我可以将其用于对该ASP.Net服务器的所有请求。这会有用吗?双工连接是所有单向呼叫,我可以使用此WCF通道而不锁定对它的访问吗?
更新:感谢您的建议到目前为止。我应该注意到:我的聊天服务是自托管的,它不在IIS中运行。因此,我主要关注的是如何在应用程序卸载之前使IIS保持连接打开状态。从Web浏览器到IIS的连接将是silverlight,flash,ajax,iframes,任何东西。
答案 0 :(得分:1)
最好的办法是在应用级实现双向消息队列,用户索引消息和会话标识符。然后你可以让应用程序级别的WCF服务(又名对等)弹出并基于等待对象推送。需要锁定对队列的访问,但这是相对较低的成本。 WCF服务将做繁重的工作。但是,在某些时候,如果只使用一个代理来发送消息,我希望应用程序能够遇到瓶颈。在我看来,每个会话拥有一个专用的通道代理可能会更有效率,从而使事情变得不那么有状态。我还允许非双工连接,因为所有消息都是单向操作。
答案 1 :(得分:0)
这可能无法解答您的问题,但您可以让Silverlight执行此操作,并使用与您的桌面版本相同的代码。
答案 2 :(得分: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中添加针对Stock的注释,这些注释将传播回服务器以推送到所有其他客户端。这表明了双向通信,并希望能够执行聊天应用程序所需的大部分必要通信。
您可以看到demo application running here的屏幕截图。