客户端不读取远程MSMQ队列,但可以发送到远程队列

时间:2014-11-22 15:50:24

标签: c# msmq

我在C#中开发了Windows服务

我的Windows Server 2012有2个私有队列:queueRequests和queueResponses。

我的队列不是交易

我的客户端使用凭据MyDomain \ UserDeploy执行控制台应用程序。

服务器中的Windows服务使用凭据MyDomain \ UserAgent执行。

MyDomain \ UserAgent和MyDomain \ UserDeploy用户对队列具有完全控制权:queueRequests和queueResponses。

服务器和客户端位于同一个MyDomain中。

控制台应用程序客户端,用于从/向服务器中的专用队列发送消息和读取消息。

服务器中的Windows服务从/ toprivate队列发送消息和读取消息。

执行步骤:

  1. 控制台应用程序客户端将消息A发送到专用队列 服务器中的queuerequests

  2. Windows服务从私有队列队列请求中读取消息A

  3. Windows服务sendMessage B到私有队列队列响应

  4. 控制台应用程序客户端从专用队列读取消息B. queueresponses。

  5. 它正在完成所有步骤。

    现在,我不知道原因,第4步失败了。 客户端无法从远程队列中读取消息。

    我不明白为什么:客户端可以将消息发送到队列,但不能从队列中读取。

    我收到 MessageQueueException 但是exception.Message为空。

    有什么好的疑难解答建议吗?

    片段代码:

        const string ForSend = @"FormatName:DIRECT=OS:{0}\private$\DeploymentCommands";
        const string ForRead = @"FormatName:DIRECT=OS:{0}\private$\DeploymentResponses";
    
     private DeploymentResponse WaitForResponse()
            {
                try
                {
                    Message rsp = colaStatus.ReceiveByCorrelationId(correlationId, new TimeSpan(0, timeOut, 0));
                    DeploymentResponse ret = rsp.Body as DeploymentResponse;
    
                    Console.WriteLine("Respuesta WaitForResponse:" + ret.DeploymentId + " - " + ret.Status);
                    Trace.WriteLine("Respuesta WaitForResponse:" + ret.DeploymentId + " - " + ret.Status);
                    return ret;
                }
                catch (MessageQueueException ex)
                {
                    Console.WriteLine("Error WaitForResponse in remote server " + remoteServer + ". " + ex.Message);
                    Trace.WriteLine("Error WaitForResponse in remote server " + remoteServer + ". " + ex.Message);
                    return null;
                }
                catch (Exception)
                {
                    throw;
                }
            }
    

    有关 MessageQueueException 的详情。

    我得到了

    消息:null
    MessageQueueErrorCode -2147023169
    ErrorCode -2147467259

    但没有在MessageQueueErrorCode Enumeration中找到该代码。

    -2147023169值。在十六进制中: 800706BF

    -2147467259值。在十六进制中: 80004005

    关于这些代码的信息不多。只有我得到:

      

    0x80004005 -2147467259 E_Fail
      0x800706BF -2147023169 PRC_S_Call_Failed_DNE

    Windows Update Codes

    完全跟踪例外:

      

    消息: - MessageQueueErrorCode -2147023169 - ErrorCode-2147467259   堆栈跟踪:
      在System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()

         

    at System.Messaging.MessageQueue.ReceiveBy(String id,TimeSpan timeout,   Boolean remove,Boolean compareId,Boolean throwTimeout,   MessageQueueTransaction事务,MessageQueueTransactionType   transactionType)

         

    at System.Messaging.MessageQueue.ReceiveByCorrelationId(String   correlationId,TimeSpan超时)

         

    在DeploymentAgent.Client.DeploymentInvoker.WaitForResponse()

2 个答案:

答案 0 :(得分:0)

你可能尝试的事情:

  1. 更改队列权限 - see here,尝试将权限设置为“所有人”(仅限测试)。
  2. 尝试在注册表中设置AllowNonauthenticatedRPC - details here

答案 1 :(得分:0)

您是否应该考虑使用 public 而不是private个队列。阅读以下有关公共队列优势的文章: