3

クライアントがサーバー側のメッセージ キューからメッセージを受信するために使用できる 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 のシリアル化の問題ですか? 私が本当にやりたいことは、クライアントがメッセージを正常に受信したことをどうにかして知ることです。今考えられる唯一のことは、アイテムが正常に受信されたことを示すためにクライアントが呼び出すことができる 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);

そのため、クライアントはすべての ID を私に送り返す必要があります。これを行うより良い方法はありますか?WCF ではなく ASP.NET でこれを行っていた場合、メソッドで応答ストリームを開いてデータを書き戻し、それを try/catch に含めることができますが、WCF では同じ柔軟性がないようです。 、カスタムメッセージライターと拡張機能をたくさん作成することなく...クライアントへの送信中にエラーが発生したかどうかを判断する方法を知っている人はいますか? ws-reliablemessaging は私に何かを与えますか?

4

1 に答える 1

3

ReliableSessions (WsHttpBinding で使用可能) を使用すると、トランスポート レベルのエラーが発生した場合に、クライアントがメッセージを確実に受信できるようになります。クライアント側のシリアル化レイヤーのエラーは、そこで処理する必要があります。

クライアントからさらに確認応答が必要な場合は、( WsDualHttpBindingを使用して) 二重サービス コントラクトを実装して、クライアントからサーバーに簡単に通信することができます。

于 2009-12-21T16:00:43.307 に答える