WCF WebService - 有没有办法确定客户端收到响应?

时间:2009-12-21 15:53:28

标签: .net wcf web-services ws-reliablemessaging

假设我有一个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 ='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能给我什么吗?

1 个答案:

答案 0 :(得分:3)

ReliableSessions(与WsHttpBinding一起提供)将透明地确保客户端在传输级别错误的情况下收到您的消息。客户端的序列化层中的错误必须在那里处理。

如果您需要来自客户端的更多确认,您可以实施双工服务(使用WsDualHttpBinding)合同,以便从客户端轻松地与服务器通信。