MSMQ + WCF:WindowsDomain MsmqAuthenticationMode需要发件人的SID

时间:2012-05-29 10:41:25

标签: wcf msmq sid

尝试使用WCF发送/接收MSMQ队列时收到以下错误:

  

“创建邮件安全上下文失败,因为邮件中找不到发件人的SID。无法接收邮件.WindowsDomain MsmqAuthenticationMode需要发件人的SID。”

这会导致所有邮件失败,从而转移到另一个毒群。该错误似乎在接收服务上触发。

客户端配置如下:

<netMsmqBinding>
    <binding name="OrderServiceMsmqBinding"
              durable="true"
              exactlyOnce="true"
              maxReceivedMessageSize="2147483647"
              maxRetryCycles="1"
              receiveErrorHandling="Move"
              receiveRetryCount="1"
              retryCycleDelay="00:0:05"
              deadLetterQueue="Custom"
              customDeadLetterQueue="net.msmq://localhost/private/Services.DeadOrderListenerService/DeadOrderListenerService.svc"                  
              useMsmqTracing="true">
      <security mode="None" />
      <readerQuotas maxStringContentLength="2147483647" />
    </binding>
  </netMsmqBinding>

以及:

<client>
      <endpoint address="net.msmq://localhost/private/Services.OrderPlacementProviderService/OrderPlacementProviderService.svc" binding="netMsmqBinding" bindingConfiguration="OrderServiceMsmqBinding" contract="Providers.IOrderPlacementService" name="orderingMsmqEndpoint" />
</client>

接收服务的配置大致相同:

<netMsmqBinding>       
        <binding name="OrderServiceMsmqBinding"
                 durable="true"
                 exactlyOnce="true"                 
                 maxReceivedMessageSize="2147483647"                      
                 maxRetryCycles="1"
                 receiveErrorHandling="Move"
                 receiveRetryCount="1"
                 retryCycleDelay="00:0:05"
                 deadLetterQueue="Custom"                 customDeadLetterQueue="net.msmq://localhost/private/Services.DeadOrderListenerService/DeadOrderListenerService.svc"
                 timeToLive="00:01:00"
                 useActiveDirectory="false"
                 useMsmqTracing="true">
          <readerQuotas maxStringContentLength="2147483647" />
        </binding>
      </netMsmqBinding>

<service name="Services.OrderPlacementProviderService" behaviorConfiguration="OrderServiceBehavior">
        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" name="MexOrderService" contract="IMetadataExchange" />
        <endpoint address="net.msmq://localhost/private/Services.OrderPlacementProviderService/OrderPlacementProviderService.svc" binding="netMsmqBinding" bindingConfiguration="OrderServiceMsmqBinding" contract="Providers.IOrderPlacementService" name="msmqEndpoint" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/Services.OrderPlacementProviderService" />
          </baseAddresses>
        </host>
      </service>

队列未经身份验证,暂时允许访问Everyone。这个SID问题才刚刚开始发生。它一直发生在不同的环境中,所以我假设我错误地配置了什么?

更多信息:客户端下订单(在队列中),如下所示:

 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
 {
      _orderPlacementClient.PlaceOrder(basket, transactionRef, user);       
      scope.Complete();
 }     

并且监听服务看起来像:

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void PlaceOrder(BasketDTO basket, string transactionReference, UserDTO user)
    {
        _log.Info("Order placed: " + transactionReference + " for user " + user.Id);
        try 
        {
            _prov.PlaceOrder(basket, transactionReference, user);                
        }
        catch (Exception ex)
        {
            _log.Error("Error placing order", ex);
        }           
    }

0 个答案:

没有答案