Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
Wcf 如何使服务在特定时间不接收消息_Wcf_Msmq - Fatal编程技术网

Wcf 如何使服务在特定时间不接收消息

Wcf 如何使服务在特定时间不接收消息,wcf,msmq,Wcf,Msmq,我目前正在为一个即将到来的项目学习wcf。 我正在创建的服务正在使用MSMQ更新数据库,但数据库在特定时间无法接受消息 该服务将是一个windows服务。目前我遇到的一件事是如何让服务在这些时间停止读取队列中的消息,例如,假设我不想在周日读取队列中的消息。我将如何着手实施这一点。这样客户端就可以向更新数据库的队列发送消息,但服务直到星期一才读取消息,这样数据库才能在星期一获得所有更新 我已经开始考虑创建一个customhost,但我不确定我的方向是否正确 提前感谢。WCF真的帮不了你什么-这是你

我目前正在为一个即将到来的项目学习wcf。 我正在创建的服务正在使用MSMQ更新数据库,但数据库在特定时间无法接受消息

该服务将是一个windows服务。目前我遇到的一件事是如何让服务在这些时间停止读取队列中的消息,例如,假设我不想在周日读取队列中的消息。我将如何着手实施这一点。这样客户端就可以向更新数据库的队列发送消息,但服务直到星期一才读取消息,这样数据库才能在星期一获得所有更新

我已经开始考虑创建一个customhost,但我不确定我的方向是否正确


提前感谢。

WCF真的帮不了你什么-这是你的应用程序的逻辑

如果您不想在周日接受任何邮件,请在周日关闭Windows服务。您可以使用预定的任务来完成此操作,例如,在周六23:59:59关闭它,然后在周一上午或其他时间重新打开它

或者在代码中处理它-如果是星期天,不要处理任何消息


我得说,这真的与WCF无关。WCF中没有任何东西允许您在给定的时间段内“禁用”或隐藏WCF服务。

您可以编写类似的内容

If Date.Now.DayOfWeek = DayOfWeek.Sunday Then
 <Store it in a List(Of <MyClass>) > 
ElseIf Not <List(Of <MyClass>)> is Nothing Then
 <Call update Db function passing <List(Of <MyClass>)> and clear <List(Of <MyClass>)>)
End If
如果Date.Now.DayOfWeek=DayOfWeek.Sunday那么
否则就什么都不是了

我将用我相信你想要的逻辑来重新发布@hgulyan的答案:

If Date.Now.DayOfWeek = DayOfWeek.Sunday Then
 ' Do nothing, it is Sunday and I don't want to process anything. 
Else
 ' Call function that processes messages in MSMQ
End If

这样你的服务可以一直运行,但是如果是星期天。。。它没有任何作用。

为了最终得到一个有效的解决方案,我滚动了自己的IIInputChannel(它覆盖了WaitFormMessage和BeginWaitFormMessage方法,因此它们在星期天返回False)这是为了使频道无法接收任何消息,我还创建了一个新的频道侦听器来实现自定义频道,然后为通道侦听器创建了一个新的bindingelement

我不得不改变一些事情,比如消息的生存时间,以及频道侦听器的默认超时


这项服务的基础工作已经完成,我现在有了一个工作概念要继续进行。

很抱歉没有说得更清楚,但我正在努力解决的问题是如何停止服务在代码中处理消息,而不使用计划任务。我相信这应该很容易做到,但我对整个WCF堆栈都是新手。@Miker169:那么你到底想做什么呢?停止WCF服务,一段时间内不接受任何消息??或者您想将消息接收到MSMQ中,但不从队列中处理它们?我想将消息接收到MSMQ中,但在星期一之前不从队列中处理。@Miker169:好的,在这种情况下,再次强调,最简单的方法是在这段时间内关闭承载WCF服务的NT服务。只要在周六做一个
NET-STOP-MyService
,周一再做一次
NET-START-MyService
。在WCF和Windows中都没有任何东西可以让这变得非常简单……感谢您的建议,似乎最好的方法是将其设置为计划任务。实际上,自动化是我更喜欢的东西。我以星期天为例,在现实中,有一段时间是3天,一个月3次,无法对数据库进行更新。大约有15/16个服务无法处理队列中的消息。我曾计划使用一个单独的服务,当15/16服务无法处理来自各自队列的消息时,告诉它们时间。发生这种情况的日期也会随着月份的变化而变化。好的,但我希望将消息保留在队列中。有没有一种方法可以在运行时动态更改服务正在侦听的端点,以便队列中的消息一直保留到周一?没有,正如Marc所说,WCF中没有允许隐藏或禁用WCF服务的内容。您应该在代码中自己完成。我目前正在尝试绕过使用服务主机,实现自己的通道侦听器。我希望在周日的时候不要再听了。