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

时间:2015-09-02 16:09:02

标签: c# wcf nettcpbinding duplex

我有一个订阅 - 发布WCF服务,该服务托管在Windows服务中。 Windows服务处理的数据将发送到订阅的客户端。对于某些方法,我需要使用来自Service的Client Request的回调。但是,我还需要发布服务通过它的任务不断生成的数据(每秒一次向客户端发送更新)。使用Callback方法执行此操作时,您会在多个方法发送大量数据时猜到它,这会导致通信对象崩溃。我读了这个WCF CallBack Blocks other Callbacks,对他而言,在我的场景中,我有多种方法每1秒推送数据(大约30行x 12C)。 由于我的客户端挂起并且CommunicationObject破产,我无法发送。 我想知道我是否可以为订阅和一般功能提供DuplexChannel,然后当我需要发布时只需添加一个单独的频道,可以在服务中动态创建并发送数据? 如果有任何人有任何经验或样本,我会很感激。

或许你可以告诉我,我在这方面都错了,WCF会以这个速率向多个方法发送回调,没有任何问题,这里有一个示例如何做到这一点。 我目前的设置是: 它是一个单独的服务 - 运行24/7的订户存储在字典中。 InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = Multiple,UseSynchronizationContext = true NetTcpBinding的。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

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

无论如何DuplexClient工作,回调也很好。错误处理在我的ServiceClass中有点过头但是直截了当。

从托管服务发布是否为控制台或Windows服务;以下代码为我做了诀窍。 ServerContract有 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);                     
}

}
}

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