2016-09-14 2 views
0

開発中のソフトウェアをリモート制御するために、WCFのSOAPクライアントを使用して自己ホストWCFサービスと通信しています。このソフトウェアは、数分(おそらく最大1時間)実行される非常に長い実行操作(Printと呼ぶ)を持っています。長時間実行されているサーバー側メソッドへのクライアント呼び出しを実装する正しい方法

  1. サーバは、何かがうまくいかない場合には、クライアントにFaultExceptionsを上げることができる必要があります:私は、次の要件指定したメソッドPrintを実装する方法を把握しようとしています。
  2. サービスへの接続が失われた場合は、クライアントにできるだけ早く通知する必要があります。
  3. サーバー側のプロセスPrintは、切断された場合でも引き続き実行する必要があるため、クライアントは再接続してプロセスの監視を続行し、必要に応じて中止することができます。

私はWCFを初めて使用しているので、これを実装する方法は不明です。それはFaultExceptionを終えるか、スローされるまで、私はそれを「火と忘れる」ことができるようにPrintasync方法を作る

  1. :私は現在、2つの選択肢を参照してください。これは簡単ですが、私はこの「問題」を見ています。WCFにはクライアント側の要求タイムアウトがあり、デフォルト値は1分で、これはasyncメソッドにも当てはまります(誤解されていない場合)大幅に増加する。これは少しハックのようです。
  2. にその動作を分割することによってPrintasync振る舞い自分自身を実装する - 印刷のためにサーバー側のタスクを開始し、直接返します(または、何かがうまくいかない場合に例外をスロー)async方法StartPringingとクライアント - をコールバックメソッドPrintingFinished。次に、コールバックPrintingFinishedを使用して、印刷プロセスが終了したときにクライアントに信号を送るか、何か問題が発生した場合に例外を送信するために追加のコールバックPrintingFailedを使用することができます。この実装はasyncメソッドPrintの背後に隠されるため、例外をスローする可能性のある他のasyncメソッドのように動作します。私は例外コールバックを実装しなければなりません。StartPringingが返された後に発生する例外を処理する必要があります(StartPringing自体からFaultExceptionsをスローすることができます)。

いずれの場合も、接続がサーブドされたとき(私は現在サービス上のpingメソッドを使用しています)、どのようにしてそのイベントを取得して内部から例外をスローするかを検出する必要があります方法Print。実装上は、print-processが終了したときや例外がスローされたときに、すでに他のすべてのイベントハンドラを実装しておく必要があるので、これはalternative(2)にもっと似ているようです。しかし、私は代替(1)のためにこれをどのように実装するのか不明です。

2つの選択肢のどちらが「より良い」ものなのか。より良いとは、次のことを指します。 1.このような長時間実行されるメソッドを実装するために、WCFの「標準的な」方法に調整されました。 2.保守性と拡張性。

他の選択肢を検討する必要がある場合は、他の提案に感謝します。

答えて

0

MSMQのようなメッセージキューを使用する信頼性の高い非同期通信が必要な場合は、私があなたの問題を理解していると思います。あなたはWCFでそれを使用することができます。https://msdn.microsoft.com/en-us/library/ms789048(v=vs.110).aspx

更新

あなたのケースでは、それは同期して、サーバーが要求を処理かどうかを知る必要があるため、サーバーへの印刷コマンドを送信するためにSOAP呼び出しを使用することができます。印刷後は長くて非同期です。この操作が完了すると(例外かどうか)、クライアントに通知する必要があります。しかし、クライアントは例えばシャットダウンすることができます。その通信ではMessage Queueがソリューションであり、MQはメッセージが確実に送信されるようにします。あなたはMSMQを使用したくない場合は https://en.wikipedia.org/wiki/Message_queue

、あなたはメモリまたはにマップ内の呼び出しと通知を一致させるために例えばUUIDを使用して、プリントサーバーによって通知される、クライアント側のWebサービスを実装することができますデータベース。

+0

お返事ありがとうございます。私はMSMQが必要だと思うのはなぜですか?私はWCFのリクエストが転送されたとの印象を受けていましたが、そうでなければ何らかの通信例外が発生します。私の実装についてさらに詳しく説明すると:私はnet.tcpバインディングを使用しており、すべての通信はローカルネットワーク上にあります。私はMSMQを知らない(と私はWCFに慣れていない)が、MSMQの通信はより多く実装されているようだ。私はKISSの原則に忠実なアプローチをしたいと思っています。私は長い実行方法しか持っていないので(必要ならば、私の質問の拡張性の部分を忘れてしまいます)。 – packoman

+0

私のコメントと私はなぜ躊躇しているのですか?私はすでに実装の詳細のほとんどをnet.tcpバインディングで解決しています。 "唯一の"欠けている(確かに大きな)部分は、私の質問で詳しく述べた方法の実装です。だからこそ、本当に良い理由がなければバインディングを切り替えることを躊躇しているのです。私はあなたの意見を聞いて非常に感謝しています... – packoman

+0

あなたの答えを更新していただきありがとうございます。ですから、私が印刷プロセスを開始した後に '非同期'部分をスキップすることを仮定しましょう。私の考えは、 'Print'メソッドが接続が失われたときに「切断された」例外をスローするようにすることです。クライアントには、サービスに再接続して印刷デバイスの状態(つまり、「印刷」がまだ実行中か終了しているかどうか)を確認する作業があります。私は、クライアントのユーザがプリンタの状態を確認し、再接続後にそれに応じて行動することができる、「プリンタアクティビティ状態」などの予見されたプロパティを持っています。この場合、MSMQは必要ありません。 – packoman

関連する問題