Допустим, у меня есть служба 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'. Поэтому мы загружаем их, а затем извлекаем все текстовые строки и возвращаем их.
Теперь моя проблема в том, что мне действительно нужно отметить эти сообщения как «отправленные =« 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? Мне бы очень хотелось, чтобы кто-то знал, что клиент получил сообщение успешно. Единственное, что я могу думать прямо сейчас сделать 2-ой метод, который клиент может позвонить, чтобы указать, что эти предметы были получены успешно:
[DataContract]
public class Message
{
[DataMember]
public long ID { get; set; }
[DataMemeber]
public string Text { get; set; }
}
затем 2-й метод на службу:
[OperationContract]
public List<Message> GetMessages();
[OperationContract]
public void ConfirmMessagesReceived(List<long> messageIds);
Таким образом, клиент должен будет отправить все идентификаторы мне. Есть лучший способ сделать это? Если бы я делал это в ASP.NET вместо WCF, я мог бы заставить этот метод открывать поток ответов и записывать данные и иметь это в try/catch, но у меня, похоже, нет такой же гибкости в WCF , не создавая кучу заказчиков сообщений и расширений ... У кого-нибудь есть лучшая идея, как определить, есть ли ошибка при передаче обратно клиенту? Получает ли ws-reliablemessaging что-нибудь?
Спасибо Ray. Я уже использую wsHttpBinding, поэтому считаю, что надежные сеансы будут работать для меня. Мне просто нужно посмотреть, как клиентам не-wcf нравится это. Некоторые из наших клиентов используют Java, и я думаю, что все еще на VB5. – CodingWithSpike