10

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

设置

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

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

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

新的暂存 msmq 设置是

  • 地址为“net.msmq://localhost/private/staging/msmqdataservice.svc”的 net.msmq 服务
  • 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 和不同队列的两个不同站点中拥有相同的端点?

4

5 回答 5

3

我的解决方法是为 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 队列。希望这可以使某人摆脱我过去一周所经历的痛苦!

于 2012-10-05T19:38:35.853 回答
0

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

于 2010-10-11T16:53:36.573 回答
0

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

于 2013-07-03T09:09:38.030 回答
0

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

MYOrganisation.Services.MyService.svc

你的队列应该被调用

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

所以,队列被称为:

MYOrganisation.Services/MyService.svc

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

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

于 2011-06-11T12:39:00.190 回答
0

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

至于绑定信息,localhost 指向的服务器应该是队列侦听器,因此如果您的队列与 IIS 安装在同一台机器上,那么这确实应该是 localhost。

于 2011-08-26T13:54:10.023 回答