代码之家  ›  专栏  ›  技术社区  ›  CodingWithSpike

wcf webservice-是否有方法确定客户端收到的响应?

  •  3
  • CodingWithSpike  · 技术社区  · 15 年前

    假设我有一个wcf服务,客户机可以使用它从某个服务器端消息队列接收消息。例如,假设数据表中有一个电子邮件服务器端队列:

    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='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);
    

    所以客户必须把所有的身份证都寄给我。有更好的办法吗?如果我是在asp.net而不是wcf中执行此操作,我可以让该方法打开响应流并写回数据,然后在try/catch中执行此操作,但我在wcf中似乎没有相同的灵活性,而不需要创建一堆自定义消息编写器和扩展…有没有人更清楚地知道在传回客户机的过程中如何判断是否有错误?WS-ReliableMessaging给了我什么吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Ray Vernagus    15 年前

    ReliableSessions (可与wshttpbinding一起使用)将透明地确保在发生传输级别错误时客户端接收到您的消息。必须在那里处理客户端序列化层中的错误。

    如果需要客户机的更多确认,可以实现双工服务(使用 WsDualHttpBinding )约定从客户端轻松地与服务器通信。