C# 是否将System.Messaging.MessageQueue或WCF用于MSMQ?

C# 是否将System.Messaging.MessageQueue或WCF用于MSMQ?,c#,.net,wcf,msmq,C#,.net,Wcf,Msmq,5年前,我开发了一个使用MSMQ的程序 当时,我使用System.Messaging.MessageQueue和System.Messaging.MessageQueueTransaction将项目放在msmq上 现在我看到人们在使用WCF,我对是否使用WCF感到困惑 首先,大多数代码示例仅显示如何使用WCF将项目放入队列,而不是退出,但更重要的是:当我使用WCF/MSMQ解决方案时,我必须创建一个额外的项目,即WCF服务 创建wcf服务当然不是问题,但我还必须在生产环境中安装它 所以我想知道:

5年前,我开发了一个使用MSMQ的程序

当时,我使用
System.Messaging.MessageQueue
System.Messaging.MessageQueueTransaction
将项目放在msmq上

现在我看到人们在使用WCF,我对是否使用WCF感到困惑

首先,大多数代码示例仅显示如何使用WCF将项目放入队列,而不是退出,但更重要的是:当我使用WCF/MSMQ解决方案时,我必须创建一个额外的项目,即WCF服务

创建wcf服务当然不是问题,但我还必须在生产环境中安装它

所以我想知道:为什么我应该使用wcf将项目放入队列,而不是使用.Net对象的解决方案

或者我错误地认为当我使用scf时,我需要一个额外的应用程序来交付,即wcf应用程序

编辑:
我们有一个网站,人们可以在那里退订。与直接点击数据库(取消订阅)不同,我们将取消订阅请求放在一个队列中,另一个服务(windows服务或控制台应用程序)将从队列中获取项目并执行数据库操作。

也许可以这样想:MSMQ是用于消息传递的资源,就像SQL Server用于关系数据存储一样。各种应用程序都可以利用此服务(.NET控制台、web、服务等,当然还有其他MQ供应商产品)


微软恰好将MSMQ紧密集成到WCF中,演示项目显示了这一点。对队列的读写问题并不重要。任何项目类型都可以对MSMQ进行平等的读写操作。

我认为您的WCF服务不需要单独的项目-我想这取决于应用程序的性质。例如,没有理由不能在同一个项目中的web应用程序中使用WCF服务

但对于您的问题,WCF对MSMQ的支持旨在为应用程序提供统一的消息传递方式,无论是通过web服务、传统服务、COM+(这是什么??)还是排队

如果您的队列完全在应用程序中,那么我不确定是否需要它

如果您的应用程序公开队列供其他人写入,那么前面有一个WCF服务可能是有意义的。它将保护您的用户不知道要写入哪个队列等。他们只需连接到服务即可发送消息。所以我认为这很好,并且对用户隐藏了一些实现细节,这是一件好事


如果您可以提供更多关于应用程序性质的详细信息,我可以提供更多的详细信息。

使用WCF包装MSMQ意味着您正在抽象传输机制,这允许您以后根据需要进行更改

您当前的解决方案有一个将请求放入队列的网站,以及一个从队列获取请求然后点击数据库的windows服务。这是完全可以接受的,如果你知道你将永远使用MSMQ,阿门

但是,您可以按如下方式进行更改:

  • 您的windows服务现在承载WCF服务(此处不需要额外的项目)。WCF服务公开了一个
    Unsubscribe
    方法(方法名称描述逻辑操作,而不是如何完成)
  • 您的网站现在充当引用该服务的WCF客户端(此处不需要额外的项目)。网站代码调用
    Unsubscribe
    方法
  • 您可以将WCF绑定配置为使用MSMQ

如果将来您认为MSMQ是不必要的,或者您想了一个更好的方法,您可以更改WCF绑定以使用其他绑定,代码将保持不变。

我最近也遇到过类似的问题。就我个人而言,我从来都不想用WCF编写另一个应用程序。这太复杂了,如果你的配置设置有误,或者组合有误,你可以花几个小时在谷歌上找到解决方法。我刚刚编写了一个简单的应用程序,它以多线程的方式从队列中提取,然后从web推送到队列中。那对你来说可能太过分了。这里有一些简单的例子可以让你振作起来,比如。

啊,你的评论很有道理。我已经编辑了这个问题,并提供了有关该场景的更多信息。