我有一个使用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
}
}
答案 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消息并获取它再次退出等等......你真的不需要处理它。