C# 我可以使用一个频道订阅并在单独的频道WCF上发布吗?

C# 我可以使用一个频道订阅并在单独的频道WCF上发布吗?,c#,wcf,nettcpbinding,duplex,C#,Wcf,Nettcpbinding,Duplex,我有一个订阅-发布WCF服务,该服务托管在Windows服务中。Windows服务处理的数据正在发送到订阅的客户端。对于某些方法,我需要使用回调从服务请求客户端。但是,我还需要发布服务通过其任务不断生成的数据(每秒向客户端发送一次更新)。使用回调方法可以做到这一点,当多个方法发送大量数据时,您可能会猜到,我得到的是communicationobject崩溃。我读了这篇文章,这对他来说很有效——在我的场景中,我有多种方法每1秒推送数据(大约30行x12c)。 由于我的客户挂起,通信对象崩溃,我无法

我有一个订阅-发布WCF服务,该服务托管在Windows服务中。Windows服务处理的数据正在发送到订阅的客户端。对于某些方法,我需要使用回调从服务请求客户端。但是,我还需要发布服务通过其任务不断生成的数据(每秒向客户端发送一次更新)。使用回调方法可以做到这一点,当多个方法发送大量数据时,您可能会猜到,我得到的是communicationobject崩溃。我读了这篇文章,这对他来说很有效——在我的场景中,我有多种方法每1秒推送数据(大约30行x12c)。 由于我的客户挂起,通信对象崩溃,我无法发送。 我想知道我是否可以为订阅和常规功能提供一个双工通道,然后当我需要发布时,只需添加一个单独的通道,或者在服务中动态创建它并发送数据? 如果有人对此有任何经验或样品,我将不胜感激

或者你可以告诉我,我在这方面完全错了,WCF将以这种速率向多个方法发送回调,没有问题,下面是一个如何做到这一点的示例。 我当前的设置是: 这是一个单例服务-运行24/7订阅服务器存储在字典中。 InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=Multiple,UseSynchronizationContext=true 网络绑定。
非常感谢您的帮助。

我正在发布我的答案,以使其他人受益。经过一次又一次的搜索,我找到了答案的一部分,电灯泡开始亮了起来。对我来说,发挥神奇作用的部分是用服务实例而不是服务类型实例化我的服务。添加行为和绑定时,我确实需要更改ServiceHost中的代码,因为当您使用typeof和uri绑定时,WCF会设置一些默认值,而当我使用ServiceInstance时,它不会设置这些默认值。不幸的是,我忘记了它“自动”为我做了什么;但它在MSDN上

无论如何,DuplexClient工作正常,回调也工作得很好。错误处理在我的ServiceClass中有点过头了,但在其他方面却很简单

从主机服务发布,无论是控制台还是Windows服务;下面的代码为我完成了这个任务。 合同已经生效 InstanceContextMode=InstanceContextMode.Single,ConcurrencyMode=Multiple,UseSynchronizationContext=true

class Publishing
{
public static ServerContract PublishService { get; set; }

public static iSortClientContracts.WCF.ServerProxy WCF_Server { get; set; }

void Publish()
{
// Create the Instance of the Service Class.
serverContract = new ServerContract(); 
// Create the Service Host using the INSTANCE I just created.
WCF.Server.ServerHost<WCF.Contracts.ServerContract> WCFServerHost = new WCF.Server.ServerHost<WCF.Contracts.ServerContract>(serverContract, baseAddress); // I am using NetTcpBinding in case someone would like to know.

// Get the Singleton Instance [InstanceMode.Singleton Pattern]
PublishService = (ServerContract)WCF_Server.SingletonInstance;

List<products> productList = new List<products>(new Product(), new Product());

System.ServiceModel.Channels.CommunicationObject comm = WCF_Server;
if (comm.State == CommunicationState.Opened)
{                    
      PublishService.PushProductsToClients(productList);                     
}

}
}
类发布
{
公共静态ServerContract PublishService{get;set;}
公共静态iSortClientContracts.WCF.ServerProxy WCF_服务器{get;set;}
作废发布()
{
//创建服务类的实例。
serverContract=新的serverContract();
//使用刚才创建的实例创建服务主机。
WCF.Server.ServerHost wcfsserverhost=new WCF.Server.ServerHost(serverContract,baseAddress);//我正在使用NetTcpBinding,以防有人想知道。
//获取Singleton实例[InstanceMode.Singleton模式]
PublishService=(ServerContract)WCF_Server.SingletonInstance;
List productList=新列表(新产品(),新产品());
System.ServiceModel.Channels.CommunicationObject comm=WCF_服务器;
if(comm.State==CommunicationState.Opened)
{                    
pushProductsToClient(产品列表);
}
}
}

我以每秒一次的间隔发布了几种类型的数据。。我不得不说这比我想象的要好。我最多只需要3个客户端-但成功地连接了13个客户端,每个客户端使用1.2%的CPU最大值[没有崩溃,甚至没有捕获-这是我所需要的。]

我正在发布我提出的答案,以便其他人受益。经过一次又一次的搜索,我找到了答案的一部分,电灯泡开始亮了起来。对我来说,发挥神奇作用的部分是用服务实例而不是服务类型实例化我的服务。添加行为和绑定时,我确实需要更改ServiceHost中的代码,因为当您使用typeof和uri绑定时,WCF会设置一些默认值,而当我使用ServiceInstance时,它不会设置这些默认值。不幸的是,我忘记了它“自动”为我做了什么;但它在MSDN上

无论如何,DuplexClient工作正常,回调也工作得很好。错误处理在我的ServiceClass中有点过头了,但在其他方面却很简单

从主机服务发布,无论是控制台还是Windows服务;下面的代码为我完成了这个任务。 合同已经生效 InstanceContextMode=InstanceContextMode.Single,ConcurrencyMode=Multiple,UseSynchronizationContext=true

class Publishing
{
public static ServerContract PublishService { get; set; }

public static iSortClientContracts.WCF.ServerProxy WCF_Server { get; set; }

void Publish()
{
// Create the Instance of the Service Class.
serverContract = new ServerContract(); 
// Create the Service Host using the INSTANCE I just created.
WCF.Server.ServerHost<WCF.Contracts.ServerContract> WCFServerHost = new WCF.Server.ServerHost<WCF.Contracts.ServerContract>(serverContract, baseAddress); // I am using NetTcpBinding in case someone would like to know.

// Get the Singleton Instance [InstanceMode.Singleton Pattern]
PublishService = (ServerContract)WCF_Server.SingletonInstance;

List<products> productList = new List<products>(new Product(), new Product());

System.ServiceModel.Channels.CommunicationObject comm = WCF_Server;
if (comm.State == CommunicationState.Opened)
{                    
      PublishService.PushProductsToClients(productList);                     
}

}
}
类发布
{
公共静态ServerContract PublishService{get;set;}
公共静态iSortClientContracts.WCF.ServerProxy WCF_服务器{get;set;}
作废发布()
{
//创建服务类的实例。
serverContract=新的serverContract();
//使用刚才创建的实例创建服务主机。
WCF.Server.ServerHost wcfsserverhost=new WCF.Server.ServerHost(serverContract,baseAddress);//我正在使用NetTcpBinding,以防有人想知道。
//获取Singleton实例[InstanceMode.Singleton模式]
PublishService=(ServerContract)WCF_Server.SingletonInstance;
List productList=新列表(新产品(),新产品());
System.ServiceModel.Channels.CommunicationObject comm=WCF_服务器;
if(comm.State==CommunicationState.Opened)
{                    
pushProductsToClient(产品列表);
}
}
}
我以每秒一次的间隔发布了几种类型的数据。。我不得不说这比我想象的要好。我只需要最多3个客户端-但成功地连接了13个客户端,每个客户端使用1.2%的CPU最大值[没有崩溃,甚至没有捕获-这是什么