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