開発中のソフトウェアをリモート制御するために、WCFのSOAPクライアントを使用して自己ホストWCFサービスと通信しています。このソフトウェアは、数分(おそらく最大1時間)実行される非常に長い実行操作(Print
と呼ぶ)を持っています。長時間実行されているサーバー側メソッドへのクライアント呼び出しを実装する正しい方法
- サーバは、何かがうまくいかない場合には、クライアントに
FaultExceptions
を上げることができる必要があります:私は、次の要件指定したメソッドPrint
を実装する方法を把握しようとしています。 - サービスへの接続が失われた場合は、クライアントにできるだけ早く通知する必要があります。
- サーバー側のプロセス
Print
は、切断された場合でも引き続き実行する必要があるため、クライアントは再接続してプロセスの監視を続行し、必要に応じて中止することができます。
私はWCFを初めて使用しているので、これを実装する方法は不明です。それはFaultException
を終えるか、スローされるまで、私はそれを「火と忘れる」ことができるようにPrint
async
方法を作る
- :私は現在、2つの選択肢を参照してください。これは簡単ですが、私はこの「問題」を見ています。WCFにはクライアント側の要求タイムアウトがあり、デフォルト値は1分で、これは
async
メソッドにも当てはまります(誤解されていない場合)大幅に増加する。これは少しハックのようです。 - 非にその動作を分割することによって
Print
のasync
振る舞い自分自身を実装する - 印刷のためにサーバー側のタスクを開始し、直接返します(または、何かがうまくいかない場合に例外をスロー)async
方法StartPringing
とクライアント - をコールバックメソッドPrintingFinished
。次に、コールバックPrintingFinished
を使用して、印刷プロセスが終了したときにクライアントに信号を送るか、何か問題が発生した場合に例外を送信するために追加のコールバックPrintingFailed
を使用することができます。この実装はasync
メソッドPrint
の背後に隠されるため、例外をスローする可能性のある他のasync
メソッドのように動作します。私は例外コールバックを実装しなければなりません。StartPringing
が返された後に発生する例外を処理する必要があります(StartPringing
自体からFaultExceptionsをスローすることができます)。
いずれの場合も、接続がサーブドされたとき(私は現在サービス上のpingメソッドを使用しています)、どのようにしてそのイベントを取得して内部から例外をスローするかを検出する必要があります方法Print
。実装上は、print-processが終了したときや例外がスローされたときに、すでに他のすべてのイベントハンドラを実装しておく必要があるので、これはalternative(2)にもっと似ているようです。しかし、私は代替(1)のためにこれをどのように実装するのか不明です。
2つの選択肢のどちらが「より良い」ものなのか。より良いとは、次のことを指します。 1.このような長時間実行されるメソッドを実装するために、WCFの「標準的な」方法に調整されました。 2.保守性と拡張性。
他の選択肢を検討する必要がある場合は、他の提案に感謝します。
お返事ありがとうございます。私はMSMQが必要だと思うのはなぜですか?私はWCFのリクエストが転送されたとの印象を受けていましたが、そうでなければ何らかの通信例外が発生します。私の実装についてさらに詳しく説明すると:私はnet.tcpバインディングを使用しており、すべての通信はローカルネットワーク上にあります。私はMSMQを知らない(と私はWCFに慣れていない)が、MSMQの通信はより多く実装されているようだ。私はKISSの原則に忠実なアプローチをしたいと思っています。私は長い実行方法しか持っていないので(必要ならば、私の質問の拡張性の部分を忘れてしまいます)。 – packoman
私のコメントと私はなぜ躊躇しているのですか?私はすでに実装の詳細のほとんどをnet.tcpバインディングで解決しています。 "唯一の"欠けている(確かに大きな)部分は、私の質問で詳しく述べた方法の実装です。だからこそ、本当に良い理由がなければバインディングを切り替えることを躊躇しているのです。私はあなたの意見を聞いて非常に感謝しています... – packoman
あなたの答えを更新していただきありがとうございます。ですから、私が印刷プロセスを開始した後に '非同期'部分をスキップすることを仮定しましょう。私の考えは、 'Print'メソッドが接続が失われたときに「切断された」例外をスローするようにすることです。クライアントには、サービスに再接続して印刷デバイスの状態(つまり、「印刷」がまだ実行中か終了しているかどうか)を確認する作業があります。私は、クライアントのユーザがプリンタの状態を確認し、再接続後にそれに応じて行動することができる、「プリンタアクティビティ状態」などの予見されたプロパティを持っています。この場合、MSMQは必要ありません。 – packoman