【问题标题】:Connecting ASP.Net to Wcf/Tcp chat service将 ASP.Net 连接到 Wcf/Tcp 聊天服务
【发布时间】:2009-02-03 04:51:31
【问题描述】:

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

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

我在想我可以与其中一个聊天服务器建立一个静态/全局双工连接,我可以将它用于对该 ASP.Net 服务器的所有请求。这行得通吗?双工连接都是单向调用,我可以在不锁定访问的情况下使用这个 WCF 通道吗?

更新:到目前为止,感谢您的建议。我应该注意到:我的聊天服务是自托管的,它没有在 IIS 中运行。所以,我主要关心如何让 IIS 保持连接打开,直到应用程序卸载。从 Web 浏览器到 IIS 的连接将是 silverlight、flash、ajax、iframe 等等。

【问题讨论】:

    标签: c# asp.net wcf soap service


    【解决方案1】:

    最好的办法是在应用级别实现双向消息队列,按用户和会话标识符索引消息。然后,您可以根据等待对象弹出和推送应用程序级别的 WCF 服务(又名对等)。对队列的访问将需要被锁定,但这是相对较低的成本。 WCF 服务将完成繁重的工作。不过,在某些时候,如果只使用一个代理发送消息,我预计应用程序会遇到瓶颈。在我看来,每个会话都有一个专用的通道代理可能更有效,从而使事情不那么有状态。我还允许非双工连接,因为所有消息都是单向操作。

    【讨论】:

    • 你是对的。每个到双工服务的连接我都必须做一个双向消息队列或两个单独的消息队列。我还在考虑使用 ReaderWriterLockSlim 来保护 wcfDuplexClients 的池,这些客户端会增长和缩小并存储在静态/全局集合中。
    • 池中的每个 wcfDuplexClient 都可以拥有自己的输入/输出消息队列。因此,我可以读取锁定 ReaderWriterLockSlim,获取 wcfDuplexClient, lock(wcfDuplexClient.sendLock){ wcfDuplexClient.Send(myCommand); }等
    • 仍在考虑每个会话的专用频道。这可能是目前最好的方法。
    • 拥有一个服务主机,它在其端点上托管排队的传入消息,并且还可以通过连接回网络上的其他聊天服务主机来发送排队的消息,以使用线程池,然后实例化瘦代理以发送消息。
    • 通道代理池最终也可能是一个好方法:jack.whyyoung.com/blog/weblogs-asp-net-rawmainfeed-aspx/…
    【解决方案2】:

    这可能无法回答您的问题,但您可以让 silverlight 执行此操作并使用您的桌面版本使用的类似代码。

    【讨论】:

    • 谢谢,我确实打算做一个 silverlight 客户端,我迫不及待地想进入那部分 :)
    【解决方案3】:

    一种可能的考虑是将 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的截图。

    【讨论】:

    • 我肯定会在完成之前制作一个 Silverlight 客户端,但这是从 Web 客户端到 IIS 的连接。我正在努力寻找将 IIS 连接到我的自托管服务的最佳解决方案,而无需为每个 Web 用户进行 wcf 连接。
    • 我知道你现在得到了什么,你已经更新了问题。请注意,服务器端不必是具有 Silverlight 轮询双工的 IIS。
    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多