3

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

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

这个接口的我的类实现看起来像这样。

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

我尝试了多种场景。

场景一:

  1. 启动服务。
  2. 启动客户端应用程序。
  3. 使用客户端应用程序将消息发送到队列
  4. 请注意,队列似乎没有填充消息,因为服务已经读取了消息。
  5. 请注意,服务中没有其他任何事情发生。
  6. 再发一条消息
  7. 请注意,消息留在队列中

场景 #2:这与场景 1 类似,但启动应用程序的顺序不同

  1. 启动客户端应用程序。
  2. 使用客户端应用程序将消息发送到队列
  3. 请注意,队列似乎确实填充了消息,因为服务没有启动并且没有读取消息。
  4. 启动服务。
  5. 请注意,该消息消失了。
  6. 请注意,服务中没有其他任何事情发生。
  7. 再发一条消息
  8. 请注意,消息留在队列中

每次服务启动时,都会从队列中删除一条消息,因此,我的服务似乎实际上正在读取该消息,但是一旦读取该消息,它就无法确定将其发送到何处或如何处理它。

4

1 回答 1

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 语句: using System.ServiceModel.MsmqIntegration;.

有时我过于依赖智能感知。在其他绑定所在的MsmqIntegrationBinding标准下不存在。System.ServiceModel所以我改用了NetMsmqBinding

于 2012-10-29T12:19:34.663 回答