C# 事务处理死信队列中的MSMQ无效签名错误
让我首先声明,这个问题与下面的帖子非常相似:。尽管如此,《华盛顿邮报》仍不清楚是什么解决了这个问题 我的设想: 我有两个实体A和B,它们都作为彼此的服务和客户。 我还有另一个实体C,作为B的客户C# 事务处理死信队列中的MSMQ无效签名错误,c#,wcf,windows-7,msmq,windows-server-2012-r2,C#,Wcf,Windows 7,Msmq,Windows Server 2012 R2,让我首先声明,这个问题与下面的帖子非常相似:。尽管如此,《华盛顿邮报》仍不清楚是什么解决了这个问题 我的设想: 我有两个实体A和B,它们都作为彼此的服务和客户。 我还有另一个实体C,作为B的客户 A向B发送一条消息,注册它的URI 在某个事件发生时,C向B发送消息 从C收到消息后,B向a发送消息 所有消息都在事务处理队列上发送。当我仅在本地主机(Windows7Professional)上运行上述场景时,一切正常:所有消息都正确发送和接收 现在问题出现在下面的设置中,其中A和C在我的Window
<?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>
然而,仍然存在“无效签名”问题。如果有人能解释一下
非常非常感谢 我试图添加评论,但没有足够的“rep”。这不完全是一个答案,但我相信你的问题在于MSDTC 我试图添加评论,但没有足够的“rep”。这不完全是一个答案,但我相信你的问题在于MSDTC 找到了解决办法。大多数关于事务处理死信队列中“无效签名”错误的帖子或多或少地详细解释了它通常与接收端的权限问题(在本例中,是a队列的安全配置)有关。在我的例子中,问题也在于发送端。即: 如果您收到“签名无效”错误,则表示您的 通道正在尝试发送经过身份验证的消息 为完整起见,以下是我当前的安全配置:
<netMsmqBinding>
<binding name="TransactedBinding" deadLetterQueue="System" useActiveDirectory ="False">
<security mode="None">
<message clientCredentialType="None"/>
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
</security>
</binding>
</netMsmqBinding>
问题在于NetMsmqBinding。默认情况下,该绑定似乎尝试使用身份验证,这就是它失败的原因。替换:
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
与:
解决了问题。找到了解决方案。大多数关于事务处理死信队列中“无效签名”错误的帖子或多或少地详细解释了它通常与接收端的权限问题(在本例中,是a队列的安全配置)有关。在我的例子中,问题也在于发送端。即: 如果您收到“签名无效”错误,则表示您的 通道正在尝试发送经过身份验证的消息 为完整起见,以下是我当前的安全配置:
<netMsmqBinding>
<binding name="TransactedBinding" deadLetterQueue="System" useActiveDirectory ="False">
<security mode="None">
<message clientCredentialType="None"/>
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
</security>
</binding>
</netMsmqBinding>
问题在于NetMsmqBinding。默认情况下,该绑定似乎尝试使用身份验证,这就是它失败的原因。替换:
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
与:
解决了这个问题。我对MSDTC不太熟悉;你凭什么认为这可能与我的问题有关?更好的是:我有没有办法确保它确实是相关的?(顺便说一句,谢谢您的评论!)如果您登记了多台机器,则必须涉及分布式事务协调器。您提到了事务性MSMQ,而不是非事务性MSMQ。我不太熟悉MSDTC;你凭什么认为这可能与我的问题有关?更好的是:我有没有办法确保它确实是相关的?(顺便说一句,谢谢您的评论!)如果您登记了多台机器,则必须涉及分布式事务协调器。您提到了事务性MSMQ,而不是非事务性MSMQ。
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding(NetMsmqSecurityMode.None);