2009-12-21 4 views
2

Disons que j'ai un service WCF qu'un client peut utiliser pour recevoir des messages de certains file d'attente de messages côté serveur. À titre d'exemple, permet de dire qu'il ya une file d'attente côté serveur de courrier électronique dans un tableau de données:WCF WebService - Y at-il un moyen de déterminer que le client a reçu une réponse?

ID | MESSAGE_TEXT | SENT 
------------------------ 
1 | Hi!   | N 
2 | A 2nd Msg | N 

permet de définir notre service comme:

[OperationContract] 
public List<string> GetMessages() 
{ 
    var messages = LoadMessagesFromDb(); 
    var messageText = (from m in messages select m.MessageText).ToArray(); 
    return messageText; 
} 

laisse supposer que LoadMessagesFromDb() saisit simplement tous les messages où SENT = 'N'. Nous chargeons donc ceux-ci, puis extraire toutes les chaînes de texte et les renvoyer.

Maintenant, ma question est ici que je vraiment besoin de marquer les messages comme « envoyés = « Y » » dans ma table de données. Je pourrais faire quelque chose comme:

[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; 
} 

Cependant, que se passe-t-il s'il y a une erreur dans le renvoi des données au client? Peut-être un problème de connectivité, ou un problème de sérialisation WCF? Ce que j'aimerais vraiment faire, c'est savoir d'une manière ou d'une autre que le client a bien reçu le message. La seule chose que je peux penser est en ce moment faire une 2ème méthode que le client peut appeler pour indiquer que les articles ont été reçus avec succès:

[DataContract] 
public class Message 
{ 
    [DataMember] 
    public long ID { get; set; } 

    [DataMemeber] 
    public string Text { get; set; } 
} 

ont alors une 2ème méthode sur le service:

[OperationContract] 
public List<Message> GetMessages(); 

[OperationContract] 
public void ConfirmMessagesReceived(List<long> messageIds); 

Donc le client devrait me renvoyer tous les ID. Y a-t-il une meilleure manière de faire cela? Si je faisais cela dans ASP.NET au lieu de WCF, je pourrais avoir la méthode ouvrir le flux de réponse et écrire les données de retour, et ont que dans un try/catch, mais je ne semble pas avoir la même flexibilité dans WCF , sans faire un tas d'écrivains de messages personnalisés et des extensions ... Quelqu'un at-il une meilleure idée de dire s'il y a une erreur au cours de transmission au client? Est-ce que ws-reliablemessaging me donne quelque chose?

Répondre

3

ReliableSessions (disponible avec le WsHttpBinding) garantirait de manière transparente que vos messages sont reçus par le client dans le cas d'erreurs de niveau transport. Les erreurs dans la couche de sérialisation du côté client devraient être traitées ici.

Si vous aviez besoin de plus d'accusé de réception de la part du client, vous pouvez implémenter un contrat duplex (en utilisant le contrat WsDualHttpBinding) pour communiquer facilement avec le serveur depuis le client.

+0

Merci Ray. J'utilise déjà wsHttpBinding, donc je pense que les Reliable Sessions fonctionneront pour moi. J'ai juste besoin de voir comment les clients non-wcf l'aiment. Certains de nos clients utilisent Java, et je pense que l'on est encore sur VB5. – CodingWithSpike

Questions connexes