2015-01-23 3 views
2

у меня есть службы WCF, где клиентские приложения могут подключаться через MSMQ: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 говорит «подключено» на клиентских компьютерах, которые не отправляют сообщения. Очереди мертвой буквы также пусты.

Сообщения должны быть потеряны где-то между клиентом MSMQ и сервером (я остановил свое приложение и в очереди сервера я получил только сообщения от девяти клиентов - такое же поведение, если я включил ведение журнала).

Любая помощь будет оценена

Update

Я использовал счетчики производительности для мониторинга очереди. Счетчик сеансов показывает правильное значение 31 сеанса. Также счетчик входящих сообщений показывает правильные значения. Однако, если я остановлю приложение или включу ведение журнала, только часть сообщений будет сохранена в очереди.

+1

Вы нашли ссылку на статью KB, которая относится к MSMQ 1.0/Windows NT 4.0. Я знаю, что нельзя предполагать, но это действительно среда, в которой вы работаете? –

+0

Нет, это единственная информация, которую я нашел. ОС - это датацентр Windows Server 2008 R2 – Jeldrik

+0

Я просто посмотрел на один из моих старых примеров Wcf/Msmq. Единственное, что выскакивает для меня, это «void Update (DataSet ds);». Вы уверены, что ds находятся под максимальным размером? DataSets печально известны для раздувания. Можете ли вы написать метод temp для принятия строки (и, возможно, каждый клиент может отправить уникальное значение) и выписать файл temp/txt или что-то еще. как тест? – granadaCoder

ответ

1

Проблема возникает через клонировать сервер, как описано в этой записи в блоге: http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

В основном это говорит, что вы не должны клонировать серверы с особенностью MSMQ включен. Если вы сделаете это вы либо должны повторно установить функцию MSMQ на клиентских машинах или делать изменения в реестре:

1.Завершите работу MSMQ служба
2.Delete значение QMId полностью
3.Add SysPrep DWORD (под HKLM \ Software \ Microsoft \ MSMQ \ Parameters) и установите его на 1
4.Start службы MSMQ

Смежные вопросы