我有一个MVC-app,它有一个控制器,它有一个动作,应该公开来自队列中最新消息(msmq)的数据。我已经在本地机器上添加了一个私有队列。我希望应用程序在添加消息时自动从队列接收消息。为此,我在已添加到应用程序中的WCF服务上使用msmqIntegrationBinding。在约定中获取消息的方法应该将消息保存在应用程序缓存中,以便在客户端请求最新数据时可以访问它。
我现在面临的挑战是,当我将一条消息添加到队列中时,WCF-service不会拾取它。我需要对我可能做错的地方的指导,或者对我的方法的反馈。请帮帮忙。
以下是WCF-service的端点配置:
<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:
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的接口:
[ServiceContract]
public interface IQueueMessageReceiver
{
[OperationContract(IsOneWay = true, Action = "*")]
void PutScrewInfoMessage(MsmqMessage<XmlDocument> msg);
}发布于 2012-07-24 17:05:19
尝试将您的操作合同更改为
void PutScrewInfoMessage(MsmqMessage<string> msg);可能是WCF堆栈在反序列化到XmlDocument时遇到了困难。
更新
可以尝试的内容:
更新2
我认为问题出在队列权限上。您的应用程序池在用户ApplicationPoolIdentity下运行(如果它在.net 4.0应用程序池下运行)。与此身份对应的用户称为DefaultAppPool。您需要授予此用户对队列的receive message权限。要选择此用户,请在选择用户对话框中搜索名为IIS AppPool\DefaultAppPool的本地帐户。

更新3
我突然意识到IIS不是队列侦听器的合适宿主容器。这样做的原因是应用程序池在一段时间不活动后卸载。这由IIS控制,不可配置。(参见here)
我认为您应该在windows服务中创建一个新的托管容器(您可以使用控制台主机来实现这一点)来托管队列端点。windows服务将在实际的服务帐户下运行,因此授予权限将不那么复杂。
此服务可以直接写入缓存,如果不可能,则应写入数据库,网站控制器可以从中刷新缓存。
这有意义吗?
更新4
有毒消息意味着由于消息的某些问题而无法将其出队。检查名为Transactional Letter queue的系统队列,看看您的消息是否在其中。
https://stackoverflow.com/questions/11627097
复制相似问题