2009-12-21 3 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'. Поэтому мы загружаем их, а затем извлекаем все текстовые строки и возвращаем их.

Теперь моя проблема в том, что мне действительно нужно отметить эти сообщения как «отправленные =« 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 что-нибудь?

ответ

3

ReliableSessions (доступно с WsHttpBinding) будет прозрачно гарантировать, что ваши сообщения будут получены клиентом в случае ошибок транспортного уровня. Ошибки на уровне сериализации на стороне клиента должны быть обработаны там.

Если вам нужно больше подтверждения от клиента, вы можете реализовать двусторонний сервис (с использованием договора WsDualHttpBinding), чтобы легко связаться с сервером от клиента.

+0

Спасибо Ray. Я уже использую wsHttpBinding, поэтому считаю, что надежные сеансы будут работать для меня. Мне просто нужно посмотреть, как клиентам не-wcf нравится это. Некоторые из наших клиентов используют Java, и я думаю, что все еще на VB5. – CodingWithSpike

Смежные вопросы