Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事务处理死信队列中的MSMQ无效签名错误_C#_Wcf_Windows 7_Msmq_Windows Server 2012 R2 - Fatal编程技术网

C# 事务处理死信队列中的MSMQ无效签名错误

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

让我首先声明,这个问题与下面的帖子非常相似:。尽管如此,《华盛顿邮报》仍不清楚是什么解决了这个问题

我的设想: 我有两个实体A和B,它们都作为彼此的服务和客户。 我还有另一个实体C,作为B的客户

  • A向B发送一条消息,注册它的URI
  • 在某个事件发生时,C向B发送消息
  • 从C收到消息后,B向a发送消息
  • 所有消息都在事务处理队列上发送。当我仅在本地主机(Windows7Professional)上运行上述场景时,一切正常:所有消息都正确发送和接收

    现在问题出现在下面的设置中,其中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>
    
    然而,仍然存在“无效签名”问题。如果有人能解释一下


    非常非常感谢

    我试图添加评论,但没有足够的“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);