2009-12-21 98 views
2

可以說我有一個客戶端可以用來接收來自某個服務器端消息隊列的消息的WCF服務。作爲一個例子,可以說有一個數據表中的電子郵件服務器端的隊列:WCF WebService - 有沒有辦法確定客戶端收到響應?

ID | MESSAGE_TEXT | SENT 
------------------------ 
1 | Hi!   | N 
2 | A 2nd Msg | N 

讓我們定義我們的服務爲:

[OperationContract] 
public List<string> GetMessages() 
{ 
    var messages = LoadMessagesFromDb(); 
    var messageText = (from m in messages select m.MessageText).ToArray(); 
    return messageText; 
} 

讓我們假設LoadMessagesFromDb()只是抓住一切消息,其中SENT ='N'。所以我們加載它們,然後提取所有文本字符串並返回它們。

現在我的問題是,我真的需要在我的數據表中將這些消息標記爲「sent ='Y'」。我可以這樣做:

[OperationContract] 
public List<string> GetMessages() 
{ 
    var messages = LoadMessagesFromDb(); 
    var messageText = (from m in messages select m.MessageText).ToArray(); 

    // mark sent 
    foreach(var msg in messages) 
     MarkSentInDb(msg.ID); 

    return messageText; 
} 

但是,如果在將數據返回給客戶端時出錯,會發生什麼情況?可能是連接問題,還是WCF序列化問題?我真正想要做的是以某種方式知道客戶端成功接收到消息。我現在能想到的唯一的事情是使第二方法是客戶端可以調用,表明項目成功接收:

[DataContract] 
public class Message 
{ 
    [DataMember] 
    public long ID { get; set; } 

    [DataMemeber] 
    public string Text { get; set; } 
} 

然後對業務的第二個方法:

[OperationContract] 
public List<Message> GetMessages(); 

[OperationContract] 
public void ConfirmMessagesReceived(List<long> messageIds); 

因此,客戶端必須將所有ID發回給我。有一個更好的方法嗎?如果我是在ASP.NET而不是WCF中執行此操作,那麼我可以讓方法打開響應流並寫回數據,並在try/catch中寫入數據,但在WCF中似乎沒有相同的靈活性,而不需要製作大量的自定義消息編寫器和擴展...任何人都有一個更好的主意如何判斷在傳輸回客戶端時是否有錯誤? ws-reliablemessaging能給我什麼嗎?

回答

3

ReliableSessions(與WsHttpBinding一起提供)將透明地確保您的消息在傳輸級錯誤的情況下被客戶端接收。客戶端的序列化層中的錯誤必須在那裏處理。

如果您需要來自客戶端的更多確認,則可以實施雙工服務(使用WsDualHttpBinding)合同,以方便地從客戶端反饋回服務器。

+0

謝謝雷。我已經在使用wsHttpBinding了,所以我認爲Reliable Sessions會爲我工作。我只需要看看非wcf客戶如何喜歡它。我們的一些客戶使用Java,並且我認爲仍然在VB5上。 – CodingWithSpike 2009-12-21 20:08:19

相關問題