MSMQ仅从某些客户端接收消息

时间:2015-01-23 08:36:22

标签: wcf msmq

我有一个WCF服务,客户端应用程序可以通过MSMQ连接:

[ServiceContract(Namespace="http://example.com", SessionMode = SessionMode.NotAllowed)]
public interface IMyService
{
    [OperationContract(IsOneWay = true)]
    void Update(DataSet ds);
}

然后:

string queueName = ConfigurationManager.AppSettings["QueueName"];
NetMsmqBinding binding = new NetMsmqBinding("MyBinding");

if (!MessageQueue.Exists(@".\private$\" + queueName))
{
    MessageQueue.Create(@".\private$\" + queueName, binding.ExactlyOnce);
}

ServiceHost msmqHost = new ServiceHost(typeof(MyService));
msmqHost.AddServiceEndpoint(typeof(IMyService), binding, "net.msmq://localhost/private/" + queueName);

使用以下配置:

  <system.serviceModel>
    <bindings>
      <netMsmqBinding>
        <binding name="MyBinding" durable="false" exactlyOnce="false" maxReceivedMessageSize="20000000">
          <security mode="None" />
          <readerQuotas maxDepth="32" maxStringContentLength="543192" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="8456384" />
        </binding>
      </netMsmqBinding>
    </bindings>
    <services>
      <service name="MyService" behaviorConfiguration="MsMqBehavior" />
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MsMqBehavior">
          <serviceThrottling maxConcurrentCalls="50" maxConcurrentSessions="50" maxConcurrentInstances="50" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

我已经使用了具有相同配置的服务,而其他安装没有问题。但是现在在新安装中我只收到一些客户的消息(实际上只有9个 - 有31个)。我收到的消息总是来自相同的服务器。我无法在任何地方找到错误消息(Windows事件日志(客户端/服务器),WCF跟踪文件),并且MSMQ状态显示&#34;已连接&#34;在不发送邮件的客户端计算机上。死信队列也是空的。

消息必须在MSMQ客户端和服务器之间的某处丢失(我停止了我的应用程序和服务器队列,我只收到来自九个客户端的消息 - 如果我启用了日记,则会出现相同的行为)。

任何帮助将不胜感激

更新

我使用了性能计数器来监控队列。会话计数器显示31个会话的正确值。传入消息计数器也显示正确的值。但是,如果我停止应用程序或启用日记功能,则只有部分消息存储在队列中。

1 个答案:

答案 0 :(得分:1)

问题来自克隆服务器,如本博文中所述:http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

基本上它表示你必须克隆已启用MSMQ功能的服务器。如果这样做,您必须在客户端计算机上重新安装MSMQ功能或进行注册表更改:

  

1.停止MSMQ服务
  2.完全删除QMId值   3.添加SysPrep DWORD(在HKLM \ Software \ Microsoft \ MSMQ \ Parameters下)并将其设置为1
  4.启动MSMQ服务