让我首先声明这个问题与以下帖子非常相似:MSMQ messages received but not Delivered Windows 2008 R2。尽管如此,该帖子仍不清楚是什么解决了这个问题。
我的场景:
我有两个实体 A 和 B 都充当彼此的服务和客户。我还有另一个实体 C,它充当 B 的客户。
- A 向 B 发送一条消息,注册它的 URI。
- 在某些情况下,C 向 B 发送消息。
- 收到 C 的消息后,B 向 A 发送消息。
所有消息都在事务处理队列上发送。当我仅在 localhost(Windows 7 专业版)上运行上述场景时,一切都很好:所有消息都正确发送和接收。
现在问题出现在我的 Windows 7 pro 上的 A 和 C 的以下设置中。机器和 B 在 Windows Server 2012 R2 上。
对于第 1 步和第 2 步,一切正常:发送和接收消息。现在在 3 中,当 B 向 A 发送消息时,A 永远不会收到消息。MSMQ 的事件日志告诉我 B 确实发送了消息,而 A 的最后一个事件是:“消息来自网络”。
当我检查 B 上的 Transacted Dead Letter 队列时,我现在可以看到我的所有消息都有“无效签名”错误。从我收集的信息来看,这个错误似乎与身份验证问题有关,所以这是我在 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);
}
然而,仍然存在“无效签名”问题。如果有人可以对此有所了解,
很多,非常感谢提前!