WCF Msmq使用netMsmqBinding读取消息的问题

时间:2011-02-25 05:17:28

标签: wcf netmsmqbinding

我有一个使用netMsmqBinding的WCF服务,我用它来将Msmq<string>的消息添加到队列中。消息添加正常,我可以通过计算机管理控制台在队列中看到它们。

我有另一个WCF服务试图从队列中检索消息,这是我遇到问题的地方。我的服务中的方法是在将消息添加到队列时调用(该位正常工作),但Msmq<string>消息似乎具有所有空值。

我不确定如何从Msmq<string>获取消息?这是我的服务详情...任何帮助表示赞赏..

[ServiceContract]
[ServiceKnownType(typeof(Msmq<string>))]
public interface IMessageListener
{
   [OperationContract(IsOneWay = true, Action = "*")]
    void ListenForMessage(Msmq<string> msg);
}

public class MessageListener : IMessageListener
{
    [OperationBehavior(TransactionScopeRequired = false, TransactionAutoComplete = true)]
    public void ListenForMessage(MsmqMessage<string> msg)
    {
         //this gets called and seems to remove the message from the queue, but message attributes are all null
    }
}

1 个答案:

答案 0 :(得分:2)

我认为你并没有“理解”WCF对MSMQ的看法。

将WCF与netMsmqBinding一起使用时,整个想法是需要处理MSMQ的细节 - 让WCF运行时处理它!

基本上,您的方法应与任何WCF服务一样:

  • 定义您的服务合同及其方法(运营合同)
  • 将您的数据结构定义为[DataContract]并将其用于您的服务方法
  • 实施服务

所以你的服务应该是这样的:

[DataContract]
public class Customer
{
   [DataMember]
   public int ID { get; set; }

   [DataMember]
   public string Name { get; set; }

   ...
}

[ServiceContract]
public interface ICustomerService
{
    [OperationContract(IsOneWay=true)]
    void SaveCustomer(Customer myCustomer)

    [OperationContract(IsOneWay=true)]
    void CreateCustomer(int ID, string name);
}

您应该有一份数据合同来描述您的数据 - 只需您的数据,此处不需要MSMQ详细信息!那么你应该有一套处理Customer对象的服务方法 - 你可以将它放入队列进行存储,创建一个新的等等。

然后,您将为此服务契约实现客户端和服务器端,并且WCF运行时将处理MSMQ传输的所有详细信息,将有效负载(Customer对象)放入MSMQ消息并获取它再次退出等等......你真的不需要处理它。