Позвольте мне сначала заявить, что этот вопрос очень похож на следующий пост: сообщения MSMQ получены, но не доставлены Windows 2008 R2. Тем не менее, сообщение неясно, что решило проблему.
У меня есть две сущности A и B, которые действуют как услуги и клиенты друг другу. У меня также есть другая сущность C, которая действует как клиент для B.
Все сообщения отправляются в транзакционных очередях. Когда я выполняю вышеуказанный сценарий исключительно на локальном хосте (Windows 7 professional), все в порядке: все сообщения отправляются и принимаются правильно.
Теперь проблема возникает в следующей настройке, где A и C находятся на моем Windows 7 pro. машина и B находятся на Windows Server 2012 R2.
Для шагов 1 и 2 все звучит: сообщения отправляются и принимаются. Теперь в 3, когда B отправляет сообщение A, A никогда не получает сообщение. Журнал событий MSMQ сообщает мне, что B действительно отправил сообщение, пока последнее событие: "Сообщение пришло через сеть".
Когда я регистрирую очередь Transacted Dead Letter на 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);
}
Тем не менее, проблема с недопустимой подписью. Если кто-то может пролить свет на это,
много, большое спасибо заранее!
Нашел решение. Большинство сообщений о ошибке "недопустимой подписи" в очереди транзакционных мертвых букв объясняют более или менее подробные сведения о том, как обычно это относится к проблеме разрешения на принимающей стороне (в данном случае конфигурации безопасности очереди A). В моем случае проблема также была связана с отправкой. А именно:
Если вы получаете ошибки "Подпись недопустима", это означает, что ваш канал пытается отправить аутентифицированные сообщения.
Для полноты, вот моя текущая конфигурация безопасности для A:
<netMsmqBinding>
<binding name="TransactedBinding" deadLetterQueue="System" useActiveDirectory ="False">
<security mode="None">
<message clientCredentialType="None"/>
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
</security>
</binding>
</netMsmqBinding>
Конечная точка службы относится к этой привязке, используя:
<endpoint address="net.msmq://localhost/private/MainOrchestrator/MainOrchestratorService" binding="netMsmqBinding" bindingConfiguration="TransactedBinding" contract="MachineCommunication.Contracts.OrchestratorContracts.IOrchestratorService" />
Хотя это все нормально и денди, этого недостаточно.
На стороне B, я отправлял сообщения с:
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
EndpointAddress epAddr = new EndpointAddress(client.clientUri);
OrchestratorServiceClient orchestratorServiceClient = new OrchestratorServiceClient(msmqCallbackBinding, epAddr);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
sendAction(orchestratorServiceClient);
scope.Complete();
}
orchestratorServiceClient.Close();
Проблема связана с NetMsmqBinding. По умолчанию кажется, что эта привязка пытается использовать аутентификацию, и именно поэтому она не удалась. Замена:
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
с:
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding(NetMsmqSecurityMode.None);
Исправлена проблема.
Я попытался добавить комментарий, но мне не хватает "rep". Это не совсем ответ, но я считаю, что ваша проблема связана с MSDTC.