启用WCF读取已存在的MSMQ队列

时间:2012-10-26 12:39:32

标签: wcf c#-4.0 msmq

我使用.Net Framework 4.0开发了WCF自托管服务。

[ServiceContract(SessionMode=SessionMode.Required)]
[ServiceKnownType(typeof(XmlDocument))]
public interface IMyMSMQ
{
    [OperationContract(IsOneWay=true, Action="*")]
    void OnMessageReceived(MsmqMessage<XmlDocument> msg);
}

此接口的My Class实现如下所示。

public class MyMSMQ : IMyMSMQ, IErrorHandler 
{
    public void OnMessageReceived(MsmqMessage<XmlDocument> msg)
    {
      // Log Message To appropriate destination
      Logger.LogMessage(msg);
    }
}

我尝试了多种方案。

情景1:

  1. 启动服务。
  2. 启动客户端应用
  3. 使用客户端应用程序将消息发送到队列
  4. 请注意,Queue似乎没有填充该消息,因为该服务已经读取了该消息。
  5. 请注意,服务中没有其他任何事情发生。
  6. 再发送一条消息
  7. 请注意,邮件留在队列中
  8. 场景#2:这与场景1类似,但启动应用程序的顺序不同

    1. 启动客户端应用
    2. 使用客户端应用程序将消息发送到队列
    3. 请注意,Queue似乎确实填充了该消息,因为该服务未启动且尚未阅读该消息。
    4. 启动服务。
    5. 请注意,该消息会消失。
    6. 请注意,服务中没有其他任何事情发生。
    7. 再发送一条消息
    8. 请注意,邮件留在队列中
    9. 每次服务启动时,都会从队列中删除一条消息,因此看起来我的服务实际上正在读取消息,但它无法确定在何处发送消息或在读取消息时如何处理消息。

1 个答案:

答案 0 :(得分:1)

我发现WCF库中的代码不是问题。这就是我定义端点绑定的方式。

            MsmqIntegrationBinding binding = new MsmqIntegrationBinding(MsmqIntegrationSecurityMode.None);
            binding.ReceiveTimeout = new TimeSpan(0, 1, 0);  // set timeout to 1 minute.
            binding.ReceiveErrorHandling = ReceiveErrorHandling.Fault;

            this.AddServiceEndpoint(typeof(eRxMsmqWCF.IeRxMSMQ), binding, GetMQUri());

需要MsmqIntegrationBinding(要求您包含以下使用声明:using System.ServiceModel.MsmqIntegration;

有时候我过分依赖intellisense。其他绑定所在的标准MsmqIntegrationBinding下不存在System.ServiceModel。所以我改用了NetMsmqBinding