Позвольте мне сначала заявить, что этот вопрос ужасно похож на следующий пост: Сообщения MSMQ получены, но не доставлены Windows 2008 R2. Тем не менее, в сообщении неясно, что решило проблему.
Мой сценарий:
У меня есть две организации A и B, которые действуют друг для друга как услуги и клиенты. У меня также есть еще один объект C, который действует как клиент B.
- A отправляет сообщение B, регистрируя его URI.
- В случае какого-то события C отправляет сообщение B.
- Получив сообщение от C, B отправляет сообщение A.
Все сообщения отправляются в очереди транзакций. Когда я запускаю описанный выше сценарий исключительно на локальном хосте (Windows 7 Professional), все в порядке: все сообщения отправляются и принимаются правильно.
Теперь проблема возникает в следующей настройке, где A и C находятся в моей Windows 7 pro. машина, а B - на Windows Server 2012 R2.
На шагах 1 и 2 все в порядке: сообщения отправляются и принимаются. Теперь в 3, когда B отправляет сообщение A, A никогда не получает сообщение. Журнал событий MSMQ сообщает мне, что B действительно отправил сообщение, в то время как последнее событие A: «Сообщение пришло по сети».
Когда я проверяю очередь обработанных мертвых писем на B, я вижу, что все мои сообщения содержат ошибку «недействительная подпись». Из того, что я собрал, похоже, что эта ошибка может быть связана с проблемами аутентификации, поэтому вот что я сделал в конфигурации A:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<!-- use appSetting to configure MSMQ queue name -->
<add key="queueName" value=".\private$\MainOrchestrator/MainOrchestratorService" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<system.serviceModel>
<services>
<service name="MachineCommunication.Orchestrators.MainOrchestrator.MainService" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:13000/" />
</baseAddresses>
</host>
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/MainOrchestrator/MainOrchestratorService" binding="netMsmqBinding" bindingConfiguration="TransactedBinding" contract="MachineCommunication.Contracts.OrchestratorContracts.IOrchestratorService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<client>
<endpoint address="net.msmq://windowsserver2012address/private/Zeiss/ZeissAdapterService" binding="netMsmqBinding" bindingConfiguration="TransactedBinding" contract="IAdapterService" name="ZeissAdapter" />
</client>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netMsmqBinding>
<binding name="TransactedBinding" deadLetterQueue="System" useActiveDirectory ="False">
<security mode="None">
<message clientCredentialType="None"/>
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
</security>
</binding>
</netMsmqBinding>
</bindings>
</system.serviceModel>
</configuration>
Я также создаю очередь следующим образом:
MessageQueue queue;
if (!MessageQueue.Exists(queueName))
{
queue = MessageQueue.Create(queueName, true);
queue.Authenticate = false;
queue.SetPermissions("ANONYMOUS LOGON",
MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
}
Тем не менее, проблема с "недействительной подписью" все еще сохраняется. Если кто-то может пролить свет на это,
большое, большое спасибо заранее!