【问题标题】:MSMQ wcf activation issue with .net 4.0 and server 2008.net 4.0 和 server 2008 的 MSMQ wcf 激活问题
【发布时间】:2011-02-26 10:34:11
【问题描述】:

我有从 net 3.5 移植的 .net 4.0 应用程序,它使用在服务器 2008 x64 上运行的 net.msmq

设置

  • net.msmq 服务,地址为“net.msmq://localhost/private/msmqdataservice.svc”
  • net.msmq 端点地址为“net.msmq://localhost/private/msmqdataservice.svc”
  • MSMQ 中的队列 -> name = "$private\msmqdataservice.svc"

现在一切都在使用 .net 3.5 进行生产。

我在服务器上安装了 .net 4.0 并创建了新站点以在同一个盒子上登台。

新的暂存 msmq 设置是

  • net.msmq 服务,地址为“net.msmq://localhost/private/staging/msmqdataservice.svc”
  • net.msmq 端点地址为“net.msmq://localhost/private/staging/msmqdataservice.svc”
  • MSMQ 中的队列 -> 名称 = "$private\staging/msmqdataservice.svc"

为不同的站点创建了另一个队列。

我对新站点所做的另一个更改是,这是 iis 中的不同站点,侦听不同的 IP 地址。我已将 net.msmq 绑定到“localhost”。主站点对 net.msmq -> 'localhost' 也有相同的绑定。我认为应该是这样。如果需要一些不同的配置,请指出。

问题是我的请求进入队列但没有被应用程序接收它只是停留在那里

日志中没有任何错误的迹象。我在与此相关的日志中看到的唯一内容是警告“msmqactivation 无法发现队列”。虽然这个警告我从来没有正确理解,因为我们一直看到这个在 3.5 中使用 msmq 时一切正常。

我能想到的任何事情都经过验证并且是正确的。

  • 应用程序的应用程序池作为网络服务运行,它对队列具有完全访问权限。
  • net.msmq 激活服务正在与网络服务一起运行
  • 尝试了不同的服务 url 命名约定,结果相同

总结

请提供有关使用 net.msmq 设置多个站点的任何见解。我对两个站点都使用了 value = 'localhost' 的 net.msmq 绑定。我认为是机器名身份。

有什么方法可以诊断这个问题?

您可能想到的任何其他事情都可能会有所帮助。

昨天我们不得不推迟发布,因为在花费了大约 100 个工时之后,我们无法弄清楚问题出在哪里。也不能让它在我的开发机器上崩溃。

编辑

问题是创建新站点命名约定后不起作用

net.msmq 服务,地址为“net.msmq://localhost/private/staging/msmqdataservice.svc” net.msmq 端点地址为“net.msmq://localhost/private/staging/msmqdataservice.svc” MSMQ 中的队列 -> 名称 = "$private\staging/msmqdataservice.svc"

它与服务名称一起使用 net.msmq://localhost/private/msmqdataservice.svc

但现在我不能让两个站点使用完全相同的端点。

有什么方法可以在两个不同的站点中拥有相同的端点,在同一台机器上具有不同的 url 和不同的队列?

【问题讨论】:

    标签: .net wcf msmq netmsmqbinding


    【解决方案1】:

    对我来说,解决方法是为 Windows Server v1.1 安装 AppFabric。 (任何使用 WAS/IIS 托管的 WCF 服务或 WF 应用程序的人都必须拥有。)

    这也纠正了我每次创建非 WCF 队列时 WAS 进程崩溃的问题。即时调试器抛出这个:

     System.ServiceModel.EndpointNotFoundException was unhandled
          Message=The service '~/nonWcfQueueName' does not exist.
          Source=System.ServiceModel.Activation
          StackTrace:
               at System.ServiceModel.ServiceHostingEnvironment.NormalizeVirtualPath(String virtualPath)
               at System.ServiceModel.Channels.MsmqHostedTransportManager.HostedBindingFilter.MatchFound(String host, String name, Boolean isPrivate)
               at System.ServiceModel.Channels.MsmqBindingMonitor.MatchQueue(MatchState state)
               at System.ServiceModel.Channels.MsmqBindingMonitor.ProcessFoundQueues(MessageQueue[] queues, Dictionary`2 knownQueues, Boolean isPrivate)
               at System.ServiceModel.Channels.MsmqBindingMonitor.OnTimer(Object state)
               at System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
               at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
               at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
          InnerException: 
    

    我想没有多少人需要在同一台机器上混合使用 WCF/非 WCF 队列。希望这可以使某人摆脱我过去一周所经历的痛苦!

    【讨论】:

      【解决方案2】:

      使用不同的端口怎么样?您可以使用相同的主机名并告诉 WAS 在新 vdir 或站点中的新端口上激活。

      【讨论】:

      • Msmq 协议没有端口选项。
      【解决方案3】:

      不幸的是,侦听器使用服务名称来确定要侦听的队列,因此如果您的接收服务被调用

      MYOrganisation.Services.MyService.svc
      

      你的队列应该被调用

      net.msmq://localhost/MYOrganisation.Services/MyService.svc
      

      所以,队列被调用:

      MYOrganisation.Services/MyService.svc
      

      试试这个然后回复我。我可以发布一个完整的配置示例。

      在我看来,即使您可能没有 2 个不同的端点,您也可以使用具有不同命名空间(或只是重命名服务)的相同服务来侦听不同的队列。不理想,但这是我发现的唯一可行的方法。

      【讨论】:

        【解决方案4】:

        您的服务端点的 URI 必须匹配(或多或少,参见 http://msdn.microsoft.com/en-us/library/ms789042.aspx)队列名称。所以在这里,解决方案是创建一个名为 staging 的虚拟目录并将您的服务放在那里。

        至于绑定信息,localhost 指向的服务器应该是队列监听器,所以如果你的队列和 IIS 安装在同一台机器上,这确实应该是 localhost。

        【讨论】:

          【解决方案5】:

          还有一个有趣的点:net.msmq 列表器适配器服务似乎缓存了它无法访问队列的事实。如果它尝试访问您的服务的队列但失败,然后您为 net.msmq 侦听器适配器添加权限,它仍然无法工作。我重新启动了服务,然后队列又开始被监视了。

          【讨论】:

            猜你喜欢
            • 2011-01-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-14
            相关资源
            最近更新 更多