首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用msmqIntegrationBinding的MVC-app内的WCF服务不会接收来自msmq的消息。

使用msmqIntegrationBinding的MVC-app内的WCF服务不会接收来自msmq的消息。
EN

Stack Overflow用户
提问于 2012-07-24 16:35:14
回答 1查看 903关注 0票数 1

我有一个MVC-app,它有一个控制器,它有一个动作,应该公开来自队列中最新消息(msmq)的数据。我已经在本地机器上添加了一个私有队列。我希望应用程序在添加消息时自动从队列接收消息。为此,我在已添加到应用程序中的WCF服务上使用msmqIntegrationBinding。在约定中获取消息的方法应该将消息保存在应用程序缓存中,以便在客户端请求最新数据时可以访问它。

我现在面临的挑战是,当我将一条消息添加到队列中时,WCF-service不会拾取它。我需要对我可能做错的地方的指导,或者对我的方法的反馈。请帮帮忙。

以下是WCF-service的端点配置:

代码语言:javascript
复制
<bindings>
<msmqIntegrationBinding>
  <binding name="MsmqBinding">
    <security mode="None" />
  </binding>
</msmqIntegrationBinding>
</bindings>

<services>
  <service name="TestApp.Web.Service.QueueMessageReceiver">
    <endpoint address="msmq.formatname:DIRECT=OS:.\private$\testsmessagequeue"
                      binding="msmqIntegrationBinding"
                      bindingConfiguration="MsmqBinding"
                      contract="TestApp.Web.Service.IQueueMessageReceiver" />
  </service>
</services>

下面的代码来自QueueMessageReceiver.cs WCF-service:

代码语言:javascript
复制
public class QueueMessageReceiver : IQueueMessageReceiver
{
    private static readonly XmlSerializer Serializer = new XmlSerializer(typeof(ScrewInfoModel));

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void PutScrewInfoMessage(System.ServiceModel.MsmqIntegration.MsmqMessage<System.Xml.XmlDocument> msg)
    {
        CacheScrewInfoModelFromScrewInfoXmlDoc(msg.Body);
    }

    private static void CacheScrewInfoModelFromScrewInfoXmlDoc(XmlNode screwInfoXmlDoc)
    {
        var reader = new StringReader(screwInfoXmlDoc.InnerXml);
        var screwInfoModel = (ScrewInfoModel)Serializer.Deserialize(reader);
        Common.Utils.CacheScrewInfo(screwInfoModel);
    }
}

下面是WCF的接口:

代码语言:javascript
复制
[ServiceContract]
public interface IQueueMessageReceiver
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void PutScrewInfoMessage(MsmqMessage<XmlDocument> msg);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-24 17:05:19

尝试将您的操作合同更改为

代码语言:javascript
复制
void PutScrewInfoMessage(MsmqMessage<string> msg);

可能是WCF堆栈在反序列化到XmlDocument时遇到了困难。

更新

可以尝试的内容:

  1. 使您的队列"testsmessagequeue“具有正确的权限集。在这种情况下,运行托管您的控制器的应用程序池的服务帐户需要设置“接收消息”权限。
  2. 启用MSMQ日志(如果您使用的是Windows2008服务器或Windows7或更高版本),可以在事件查看器中的以下位置找到: Applications and Services Logs -> Microsoft -> windows -> MSMQ -> End2End。这将捕获MSMQ中发生的所有事情,包括任何错误。
  3. 尝试使队列成为事务性队列(如果还没有)。这将确保消息未送达时存在错误条件。
  4. 在服务终结点上启用WCF跟踪,以查看消息出队时发生的任何特定WCF错误。

更新2

我认为问题出在队列权限上。您的应用程序池在用户ApplicationPoolIdentity下运行(如果它在.net 4.0应用程序池下运行)。与此身份对应的用户称为DefaultAppPool。您需要授予此用户对队列的receive message权限。要选择此用户,请在选择用户对话框中搜索名为IIS AppPool\DefaultAppPool的本地帐户。

更新3

我突然意识到IIS不是队列侦听器的合适宿主容器。这样做的原因是应用程序池在一段时间不活动后卸载。这由IIS控制,不可配置。(参见here)

我认为您应该在windows服务中创建一个新的托管容器(您可以使用控制台主机来实现这一点)来托管队列端点。windows服务将在实际的服务帐户下运行,因此授予权限将不那么复杂。

此服务可以直接写入缓存,如果不可能,则应写入数据库,网站控制器可以从中刷新缓存。

这有意义吗?

更新4

有毒消息意味着由于消息的某些问题而无法将其出队。检查名为Transactional Letter queue的系统队列,看看您的消息是否在其中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11627097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档