我可以使用一个频道订阅并在单独的频道 WCF 上发布吗?
Can I Subscribe using one channel and publish on a seperate channel WCF?
我有一个订阅-发布 WCF 服务,该服务托管在 Windows 服务中。 Windows 服务处理的数据正在发送给订阅的客户端。对于某些方法,我需要对来自服务的客户端请求使用回调。但是,我还需要发布服务通过其任务不断生成的数据(每秒向客户端发送一次更新)。使用 Callback 方法执行此操作时,您猜对了,当不止一种方法发送大量数据时,我得到了通信对象的崩溃。我读了这个 WCF CallBack Blocks other Callbacks ,这对他有用 - 在我的场景中,我有多种方法每 1 秒推送一次数据(大约 30 行 x 12C)。
由于我的客户端挂起并且 CommunicationObject 崩溃,我无法发送。
我想知道我是否可以只为订阅和一般功能设置一个 DuplexChannel,然后当我需要发布时,只需添加一个单独的 Channel,也许可以在服务中即时创建它并发送数据?
如果有人对此有任何经验或样本,我将不胜感激。
或者您可以告诉我,我在这方面完全错了,WCF 将以这种速率向多个方法发送回调而不会出现任何问题,下面是如何执行此操作的示例。
我当前的设置是:
这是一项单例服务 - 运行 24/7 订户存储在字典中。
InstanceContextMode=InstanceContextMode.Single,
ConcurrencyMode = 多个,UseSynchronizationContext = true
NetTcp 绑定。
感谢任何帮助。
我发布了我想出的答案,以便其他人可以受益。搜索和搜索后 - 我遇到了部分答案,灯泡开始亮起。对我来说最神奇的部分是用服务实例实例化我的服务——而不是服务的类型。添加我的行为和绑定时,我确实需要更改 ServiceHost 中的代码 - 因为当您使用 typeof 和 uri 绑定时 - WCF 设置了一些默认值,而当我使用 ServiceInstance 时 - 它不会设置这些默认值。不幸的是,我忘记了它 'automagically' 为我做了什么;但它在 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 个客户端,每个客户端最多使用 1.2% CPU [没有崩溃甚至没有捕获 - 这正是我所需要的。] 并且服务主机甚至没有打破汗!
我有一个订阅-发布 WCF 服务,该服务托管在 Windows 服务中。 Windows 服务处理的数据正在发送给订阅的客户端。对于某些方法,我需要对来自服务的客户端请求使用回调。但是,我还需要发布服务通过其任务不断生成的数据(每秒向客户端发送一次更新)。使用 Callback 方法执行此操作时,您猜对了,当不止一种方法发送大量数据时,我得到了通信对象的崩溃。我读了这个 WCF CallBack Blocks other Callbacks ,这对他有用 - 在我的场景中,我有多种方法每 1 秒推送一次数据(大约 30 行 x 12C)。 由于我的客户端挂起并且 CommunicationObject 崩溃,我无法发送。 我想知道我是否可以只为订阅和一般功能设置一个 DuplexChannel,然后当我需要发布时,只需添加一个单独的 Channel,也许可以在服务中即时创建它并发送数据? 如果有人对此有任何经验或样本,我将不胜感激。
或者您可以告诉我,我在这方面完全错了,WCF 将以这种速率向多个方法发送回调而不会出现任何问题,下面是如何执行此操作的示例。 我当前的设置是: 这是一项单例服务 - 运行 24/7 订户存储在字典中。 InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode = 多个,UseSynchronizationContext = true NetTcp 绑定。 感谢任何帮助。
我发布了我想出的答案,以便其他人可以受益。搜索和搜索后 - 我遇到了部分答案,灯泡开始亮起。对我来说最神奇的部分是用服务实例实例化我的服务——而不是服务的类型。添加我的行为和绑定时,我确实需要更改 ServiceHost 中的代码 - 因为当您使用 typeof 和 uri 绑定时 - WCF 设置了一些默认值,而当我使用 ServiceInstance 时 - 它不会设置这些默认值。不幸的是,我忘记了它 'automagically' 为我做了什么;但它在 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 个客户端,每个客户端最多使用 1.2% CPU [没有崩溃甚至没有捕获 - 这正是我所需要的。] 并且服务主机甚至没有打破汗!