Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将ASP.Net连接到Wcf/Tcp聊天服务_C#_Asp.net_Wcf_Soap_Service - Fatal编程技术网

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

C# 将ASP.Net连接到Wcf/Tcp聊天服务,c#,asp.net,wcf,soap,service,C#,Asp.net,Wcf,Soap,Service,我有一个WCF聊天服务,它接受双工tcp连接。单双工tcp连接可用于发送和接收多个用户的消息(因此,我可以有多个聊天服务器,它们都相互连接) 现在我想将Web用户添加到组合中,让他们与桌面用户聊天。这是一个活的支持类型的东西。基本上,我正在试图找到从ASP.Net到这个聊天服务进行“带外”通信的最佳方法 我在想,我可以与其中一个聊天服务器建立静态/全局双工连接,并且我可以将其用于对该ASP.Net服务器的所有请求。这样行吗?双工连接都是单向呼叫,我可以使用这个WCF通道而不锁定对它的访问吗 更新

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

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

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


更新:谢谢你的建议。我应该注意到:我的聊天服务是自托管的,它没有在IIS中运行。因此,我主要关心的是如何使IIS保持连接打开,直到应用程序卸载。从web浏览器到IIS的连接将是silverlight、flash、ajax、iframes等等。

这可能无法回答您的问题,但是,您可能可以使用Silverlight来实现,并使用与桌面版本相似的代码。

< P>一种可能的考虑是将Silverlight 2应用程序作为Web用户导航到的ASP.NET页面的一部分。

此Silverlight应用程序可以利用Silverlight 2 SDK附带的System.ServiceModel.PollingDuplex.dll程序集()中的WCF轮询双工支持

我有一个示例,演示如何从控制台应用程序“推送”股票更新,该控制台应用程序自行托管具有两个端点的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中的库存添加注释,这些注释会传播回服务器,并推送到所有其他客户端。这演示了两个方向的通信,并有望实现聊天应用程序所需的大部分通信


您可以看到的屏幕截图。

您的最佳选择是在应用程序级别实现双向消息队列,通过用户和会话标识符为消息编制索引。然后,您可以使用基于等待对象的应用程序级WCF服务(也称为对等)弹出和推送。需要锁定对队列的访问,但这是相对较低的成本。WCF服务将负责起重工作。不过,在某个时候,如果只使用一个代理发送消息,我预计应用程序会遇到瓶颈。在我看来,每个会话都有一个专用的通道代理可能会更有效,从而降低状态。我还允许非双工连接,因为所有消息都是单向操作

在我完成之前,我肯定会制作一个Silverlight客户端,但这是从web客户端到IIS的连接。我正在努力寻找将IIS连接到我的自托管服务的最佳解决方案,而无需为每个web用户进行wcf连接。我知道您现在得到了什么,您已经更新了问题。请注意,服务器端不必是具有Silverlight轮询双工的IIS。谢谢,我确实计划做一个Silverlight客户端。我迫不及待地想了解这一部分:)你说得对。我必须为每个到双工服务的连接执行一个双向消息队列或两个单独的消息队列。我还考虑使用ReaderWriterLockSlim来保护一个wcfDuplexClient池,这些wcfDuplexClient会增长和收缩,并存储在静态/全局集合中。池中的每个wcfDuplexClient都可以有自己的输入/输出消息队列。因此,我可以读取lock ReaderWriterLockSlim,获取一个wcfDuplexClient,lock(wcfDuplexClient.sendLock){wcfDuplexClient.Send(myCommand);}等,仍然考虑每个会话使用一个专用通道。这可能是目前为止最好的方法。在其端点上有一个ServiceHost承载排队的传入消息通过连接回网络上的其他聊天服务主机,也可以向发送排队消息的主机设置为使用线程池,然后实例化用于发送消息的精简代理。通道代理池也可能是一种很好的方法: