使用WCF直接发送到MSMQ队列

时间:2010-12-21 21:32:18

标签: wcf msmq netmsmqbinding

我有一个Windows服务,可以从各种MSMQ中获取消息。该服务从队列中获取消息,然后根据消息所来自的队列执行特定的工作流。是否可以将WCF服务配置为接受来自端点的消息并将其置于队列中?我希望服务具有多个端点,并且根据收到消息的端点,消息将被放置在不同的队列中。我已经看到了关于netMsmqBinding的事情,但到目前为止我还无法确定这是否适用于我正在考虑的用途。

感谢任何帮助,

麦克

3 个答案:

答案 0 :(得分:1)

我是否正确地得到了这个 - 你想拥有

  • 使用多个端点向外界展示的WCF服务
  • 根据消息进入WCF服务的哪个端点,它应该将这些消息放入单独的MSMQ队列中?

您绝对可以拥有一个WCF服务,它将向外部公开任意数量的端点,并将传入的消息丢弃到MSMQ队列中。我只是不确定你是否能够在WCF服务方法中知道请求来自哪个端点.....通常,WCF服务类不知道请求来自何处(和通常不需要知道......)。

我看到了一些方法:

  • 有多个服务,每个服务端点一个(类型);他们可以共享所有代码和所有内容,但如果将它分成单独的服务类,那么每个服务类本身就知道它所服务的端点,从而可以知道将信息放入哪个MSMQ队列

  • 找到一种方法来发送一些标题信息以及以某种方式告诉您将消息放在何处的消息

  • 在WCF 4.0中,您可以使用新的WCF路由服务做一些事情....不太确定它是如何工作的,但是 - 因为它还需要某种“提示”才能知道它被调用的端点以及如何路由传入的消息

答案 1 :(得分:0)

我能够解决这个问题的方法是创建一个我可以传递配置名称的自定义ServiceHost类。这是使用服务实现类型名称来定位配置的默认实现的替代方法。这允许我在同一台机器上运行同一实现的多个实例。除此之外,在自定义服务类中,我添加了一个自定义MessageInspector,它将自身附加到每个端点以侦听消息。然后,我使用IDispatchMessageInspector.AfterReceiveRequest()方法获取传入消息,然后将其放入我在配置中定义的队列中。有点复杂,但它适用于我们的场景。

答案 2 :(得分:0)

net.msmq绑定允许WCF客户端直接写入MSMQ队列,即使队列读取WCF服务不是活动的 - 它甚至不必存在。 net.msmq绑定还允许从队列中自动读取。不使用MessageQueue写入队列或从队列中读取。