将ASP.Net连接到Wcf / Tcp聊天服务

时间:2009-02-03 04:51:32

标签: c# asp.net wcf soap service

我有一个接受双工tcp连接的WCF聊天服务。单个双工tcp连接可用于为多个用户发送和接收消息(因此我可以将多个聊天服务器相互连接)。

现在我想将Web用户添加到组合中,让他们与桌面用户聊天。这是一个实时支持型的东西。基本上我正试图找出从ASP.Net到这个聊天服务进行“带外”通信的最佳方式。

我原以为我可以与其中一个聊天服务器建立静态/全局双工连接,我可以将其用于对该ASP.Net服务器的所有请求。这会有用吗?双工连接是所有单向呼叫,我可以使用此WCF通道而不锁定对它的访问吗?

更新:感谢您的建议到目前为止。我应该注意到:我的聊天服务是自托管的,它不在IIS中运行。因此,我主要关注的是如何在应用程序卸载之前使IIS保持连接打开状态。从Web浏览器到IIS的连接将是silverlight,flash,ajax,iframes,任何东西。

3 个答案:

答案 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的屏幕截图。