2011-02-25 63 views
0

我有一個使用netMsmqBinding的WCF服務,我正在使用它將Msmq<string>的消息添加到隊列中。消息添加的很好,我可以通過計算機管理控制檯在隊列中看到它們。WCF使用netMsmqBinding讀取消息的Msmq問題

我有另一個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

首先:您的實現類中的方法不需要[OperationContract] - 實際上,您**不應**在那裏具有該屬性 – 2011-02-25 05:35:40

回答

2

我覺得你不是很「漸」 WCF超過MSMQ的想法。

當與netMsmqBinding一起使用WCF時,整個想法是你不需要需要處理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消息中並將其重新取出,等等......您不必處理這些,真的。