问题标签 [netmsmqbinding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
223 浏览

wcf - 为什么 IIS/WAS 服务不使用 MSMQ 4.0 清理 Win 2k8R2 上的锁定队列

我有一个 IIS/WAS 托管服务在开发环境中以我自己的身份运行。它是使用 net.msmq 绑定激活的。它被配置为使用 BufferedReceive(它是一个 WF 服务),这涉及锁定队列。(创建前缀为 lock_ 的子队列)。

一段时间后,应用程序池终止后,锁定队列会自动删除。

将系统移至生产环境后,环境 AFAIK 相同,但服务作为专用帐户运行,不再清理锁定队列。如果我停止应用程序池,锁定队列仍然存在,并带有消息。

最明显的区别是运行服务的帐户,但我找不到影响这一点的权限。或者,我是否忽略了其他一些配置差异。感谢帮助。

0 投票
1 回答
712 浏览

wcf - 无法从(死信)队列中获取服务

我在远程机器上有一个名为 log 的队列。当我在本地调用该队列时,我通过修改我的 NetMsmqBinding 来指定一个自定义死信队列:

这很好用;当我强制我的消息无法到达其目的地时,它会出现在此队列中。

现在,我有一个托管在 IIS/WAS 中的服务来读取死信队列。它托管在一个名为 Services 的站点中,位于 Services/Logging/LogDeadLetterService.svc。这是我的配置中的服务:

这是我的激活:

我的实际服务基本上是这样的:

我的队列是事务性的和经过身份验证的。我在服务站点和日志记录应用程序上都将 net.msmq 作为启用的协议包含在内,并且我将 net.msmq 绑定添加到服务站点。如果绑定信息为,则在浏览http://appdev.me.com/Logging/LogDeadLetterService.svcappdev.me.com时出现以下错误(appdev.me.com 在我的 HOSTS 文件中设置):

如果我的绑定信息为localhost,则会收到以下错误:

无论我设置哪种方式,服务都不会收到死信,因为它仍在队列中,而不是在我的事件日志中。

现在,我意识到这两个都引用了权限问题。但是,为了在确定身份验证部分之前测试此代码部分,我已将完全控制权授予我能想到的每个人 - 包括所有人、经过身份验证的用户、网络服务、IIS_USERS、匿名登录和我自己。(应用程序池以我的身份运行。)

关于如何让我的服务能够从这个队列中拉出的任何帮助都将是惊人的。谢谢!

编辑: 根据这个 MSDN 博客条目,0xC00E0003 对应于 MQ_ERROR_QUEUE_NOT_FOUND,而 0xc00e0025 对应于 MQ_ERROR_ACCESS_DENIED,所以看起来我希望绑定信息为appdev.me.com. 但是,这仍然不能解决发生的明显权限问题。

EDIT2: 如果我在控制台应用程序中托管服务并提供以下端点,它就可以工作:

那么控制台应用程序中的情况与 IIS 中的情况有何不同?由于上面的编辑,我非常有信心我正在排队。那我为什么进不去呢?

EDIT3:根据此处给出的建议将 Services/Logging/LogDeadLetterService.svc 更改为 Logging/LogDeadLetterService.svc ,但没有变化。

//

[额外问题:我需要处理死信队列中的有害消息吗?]

0 投票
1 回答
195 浏览

wcf - WCF 服务间消息传递

我正在构建一个带有 2 个 WCF 服务的系统。两者都是 IIS 托管的。目前,它们都驻留在一个 VS2010 网站应用程序中,使用 Derfault 网站在我的本地 IIS7(Windows 7)上运行。我在两者上都启用了 net.tcp。

服务1

  • 使用 webHttpBinding 接受 HTTP 帖子
  • 将数据包装在可序列化的复合对象中
  • 使用 netMsmqBinding 将复合对象发送到 Service2(我们希望)

服务2

  • 收到所述消息并对其进行处理

服务 1 按预期工作,但是我们的代码不是将消息放在配置的私有队列上,而是在“传出队列”下创建一个新队列,并带有句柄

当然,Service2 永远不会看到该消息——这是我第一次尝试这种结构,所以我不确定 Service2 是否因为它的位置而错过了该消息,但根据我所读到的内容,它似乎是这样的——我没有遇到任何提及此队列创建行为的内容。

问题:

  1. 我这样做是否正确(结构、web.config 或代码有问题)?

  2. 在 VS Debug 中正确完成后,Service1 的

    proxy.ProcessForm(formMessage);

在我的 Service2 代码中打断点,还是有另一种方法来处理 Service2 调试(例如,ala windows 服务)?

服务 1 Web.Config

收到 HTTP Post Service1 时执行以下操作:

0 投票
1 回答
170 浏览

wcf - NetMsmqBinding 可以与多播一起使用吗?

我正在尝试组合一个多播 MSMQ 示例。我找到的使用 PGM 进行多播的所有示例都具有集成绑定。我宁愿不必修改我的所有合同来使用 MsmqMessage,而且我担心我将无法为消息附加安全性。有什么我忽略了,还是我把自己画在一个角落里?

0 投票
1 回答
926 浏览

asp.net - 一旦应用程序池被回收,Net.Msmq 绑定就不会在队列中提取消息

“当应用程序池“活动”时,服务会正确拾取消息,但一旦应用程序池被回收(由于超时或任何其他原因),服务就会停止拾取仅位于队列中的消息直到通过浏览服务网页再次启动服务”

您是否找到解决方案,无需手动浏览服务即可激活服务。

0 投票
0 回答
266 浏览

wcf - WCF 和 MSMQ - 转换消息正文丢失复杂参数

我正在尝试通过 WCF 和 MSMQ 发送消息,并在发送之前对消息内容应用转换。

我可以在客户端消息检查器的 BeforeSendRequest 事件中捕获消息,将消息作为 xml 获取并对其应用 Xslt 转换,该转换实质上替换了构建消息时为空的 soap 消息中的参数值。但是,当消息到达另一个端点时,即使我已尽力在消息中插入一个值,该参数仍然为空。

如果我对消息进行硬编码以包含预期的参数,所有这些都按预期工作,那么当我应用转换时,它只会“失败”并返回空值。不知道我是否在这里做一些根本错误的事情(我对这些主题中的大多数都是新手)或者我的肥皂 xml 是否只是错误的。

我查看了在对响应进行硬编码时创建的 xml,并将其用作转换的基础。我在进出时检查了消息,摆弄了命名空间并用谷歌搜索直到我被消灭...任何帮助将不胜感激!

这是转换后消息的正文部分..

在转换中,我从源消息中复制所有节点,并用上面显示的 xml 替换“clientOrderData”元素。

目标合同如下:

ClientOperationResult 的数据契约是:

请注意,OperationResult 是 Object 类型,在运行时我提供了一个字符串。不知道跟这个有没有关系?就像我说的那样,如果我提供一个硬编码的 ClientOperationResult,它就可以工作,但如果我尝试对转换做同样的事情,它就不行。

希望一切都清楚。谢谢,W

0 投票
1 回答
1355 浏览

wcf - 服务 (.svc) 位于根目录的 MSMQ 的 WCF 激活

VS 2012/.NET4.5、Windows 8/IIS8 和 64 位

使用 WCF 服务应用程序,到目前为止我在命名我的 MSMQ 队列以匹配服务名称时看到的所有文档都假定我正在使用 IIS 网站下的应用程序或虚拟目录。

这是从 MSDN http://msdn.microsoft.com/en-us/library/ms789042.aspx引用的

被激活的应用程序必须匹配(最长匹配)队列名称的前缀。

例如,队列名称为:msmqWebHost/orderProcessing/service.svc。如果应用程序 1 有一个虚拟目录 /msmqWebHost/orderProcessing,下面有一个 service.svc,而应用程序 2 有一个虚拟目录 /msmqWebHost,下面有一个 orderProcessing.svc,则应用程序 1 被激活。如果删除应用程序 1,将激活应用程序 2。

此外,http://blogs.msdn.com/b/tomholl/archive/2008/07/12/msmq-wcf-and-iis-getting-them-to-play-nice-part-1.aspx

但是,当您在 IIS 7 WAS 中托管启用 MSMQ 的服务时,队列名称必须与服务的 .svc 文件的 URI 匹配。在此示例中,我们将在名为 MsmqService 的应用程序中托管服务,并使用名为 MsmqService.svc 的 .svc 文件,因此队列必须名为 MsmqService/MsmqService.svc。用于 WCF 服务的队列应始终是私有的

而且, http: //msdn.microsoft.com/en-us/magazine/cc163357.aspx

请务必注意,只有当队列与 .svc 文件具有相同的名称(减去计算机名称)时,MSMQ 端点的激活才能正常工作。这意味着如果您的服务端点是 /server/app/service.svc,则队列名称必须是 app/service.svc。

MyService.svc 文件直接位于我的 IIS 网站的根目录下(在集成模式下使用 .NET 4 池),因此我执行了以下操作:

  1. 创建一个名为 MyService.svc 的私有事务队列并赋予网络服务完全控制权(用于测试)。
  2. 设置我的 web.config 端点:address="net.msmq://localhost/private/MyService.svc"
  3. 我能够使用客户端测试应用程序使用 (2) 中的地址将消息推送到队列。
  4. 我通过执行以下操作向网站添加了 MSMQ 协议支持:( C:\Windows\System32\inetsrv>appcmd set site "MyWebsite" /+bindings.[protocol='net.msmq',bindingInformation='localhost']并检查它是否正确添加了支持)
  5. 从我的网站高级设置中,我http,net.tcp,net.msmqEnabled Protocols
  6. 我仔细检查了“Net.Msmq 侦听器适配器”是否正在运行,它负责在消息到达时激活服务,然后我重新启动了它。
  7. 我的web.config

新消息到达队列并且消息保留在队列中时,我的服务没有被激活。那是因为我没有使用应用程序或虚拟目录,还是我遗漏了什么?

0 投票
0 回答
194 浏览

.net - WCF 订阅者随机停止从队列轮询消息

我使用的是 wondows 2008 标准操作系统。我们有私有队列,因为该消息是由另一个应用程序发布的。我们有 WCF 订阅者从私有队列轮询消息并传递到另一个系统......

一段时间后,WCF 订阅者(作为 Windows 服务安装)停止轮询来自队列的消息。当我关闭窗口服务时,我在 Windows 日志中收到错误错误是:-

块引用

未能停止服务。System.ServiceModel.CommunicationObjectFaultedException:通信对象 System.ServiceModel.ServiceHost 无法用于通信,因为它处于故障状态。在 System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 在 Microsoft.Samples.MSMQToWCF.SubscriberWindowsService.OnStop() 在 System.ServiceProcess.ServiceBase.DeferredStop()

我真的一无所知...我在我们的应用程序日志中看不到任何错误..即使我附加了从 IErrorHandler 派生的错误处理程序..但在那里看不到任何日志...因为它可能不是我们的例外代码....

我怀疑队列的侦听通道正在中断,因此订阅者已停止但服务仍在运行..如果是这种情况如何再次重置通道???

还有什么线索???

请帮我...

0 投票
1 回答
826 浏览

wcf - 长时间运行的 WCF MSMQ 处理

我正在阅读 Programming WCF Services 第三版。朱瓦尔·洛伊。在涵盖 NetMsmqBinding 的“队列服务”一章中,在第 473 页,他说“......您应该保持服务对队列调用的处理相对较短,否则有中止播放事务的风险。这里的一个重要观察是它是错误的将排队的呼叫与冗长的异步呼叫等同起来。”

1) 什么是短调用?2) 什么是长期运行的最佳实践;send 将它们发送到 ThreadPool?

这篇文章在实践中遇到了同样的问题: WCF & MSMQ & TransactionScope long process

我看了又看,在互联网上找不到任何关于这个问题的最佳实践。

3) 如果我没有交易,这条规则是否适用?

0 投票
0 回答
177 浏览

wcf - 使用 NetMsmqActivator 激活非默认站点

是否可以让 NetMsmqActivator 服务激活在 80 以外的其他端口上运行的站点?

据我所知,您无法在 net.msmq URI 上指定端口号,因此我想不出任何方法可以让 NetMsmqActivator 在默认端口以外的任何其他端口上运行时找到正确的站点(80)。有人可以证实这一点吗?