Ошибки недействительной подписи MSMQ в транзакционной очереди недоставленных сообщений

1

Позвольте мне сначала заявить, что этот вопрос очень похож на следующий пост: сообщения MSMQ получены, но не доставлены Windows 2008 R2. Тем не менее, сообщение неясно, что решило проблему.

Мой сценарий:

У меня есть две сущности A и B, которые действуют как услуги и клиенты друг другу. У меня также есть другая сущность C, которая действует как клиент для B.

  1. A отправляет сообщение B, регистрируя его URI.
  2. После некоторого события C отправьте сообщение Б.
  3. Получив сообщение от C, B отправляет сообщение A.

Все сообщения отправляются в транзакционных очередях. Когда я выполняю вышеуказанный сценарий исключительно на локальном хосте (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);
    }

Тем не менее, проблема с недопустимой подписью. Если кто-то может пролить свет на это,

много, большое спасибо заранее!

Теги:
wcf
windows-7
windows-server-2012-r2
msmq

2 ответа

2
Лучший ответ

Нашел решение. Большинство сообщений о ошибке "недопустимой подписи" в очереди транзакционных мертвых букв объясняют более или менее подробные сведения о том, как обычно это относится к проблеме разрешения на принимающей стороне (в данном случае конфигурации безопасности очереди 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);

Исправлена проблема.

1

Я попытался добавить комментарий, но мне не хватает "rep". Это не совсем ответ, но я считаю, что ваша проблема связана с MSDTC.

  • 0
    Я не совсем знаком с MSDTC; с чего ты взял, что это может быть связано с моей проблемой? Еще лучше: есть ли способ убедиться, что это действительно связано? (и спасибо за ваш комментарий, кстати!)
  • 0
    Если вы подключите более одного компьютера, то должен быть задействован координатор распределенных транзакций. Вы упомянули транзакционный MSMQ, а не транзакционные Q. увидеть этот пост как начало

Ещё вопросы

Сообщество Overcoder
Наверх
Меню