2

時間がかかる可能性のある操作を含む WCF サービスがあります... クライアントは TimeoutException を受け取りますが、サーバーは長い操作の後も実行を続けます。

サーバ:

public void doSomeWork(TransmissionObject o) {
    doDBOperation1(o); // 
    doDBOperation2(o); // may result in TimeoutException on client
    doDBOperation3(o); // it continues doing DB operations. The client is unaware!
}

クライアント:

ServiceReference.IServiceClient cli = new ServiceReference.IServiceClient("WSHttpBinding_IService","http://localhost:3237/Test/service.svc");
int size = 1000;
Boolean done = false;
TransmissionObject o = null;

while(!done) {
   o = createTransmissionObject(size);
   try {
      cli.doSomeWork(o);
      done = true; 
   }catch(TimeoutException ex) {
      // We want to reduce the size of the object, and try again
      size--;
      // the DB operations in server succeed, but the client doesn't know
      // this makes errors.
   }catch(Exception ex) { ... }
}

サーバーはいくつかの DB 操作を実行しているため、DB 操作をロールバックできるようにサーバー側でタイムアウトを検出する必要があります。

クライアント側で[TransactionFlow]やTransactionScopeなどでTransactionsを使おうとしたのですが、サーバー側のDB操作がNESTEDされたストアドプロシージャーを使っているため、分散トランザクションが使えません。(「分散トランザクション内で SAVE TRANSACTION を使用できません。」という SqlException を受け取りました。) シンプルな SP (ネストされていない) を使用すると、トランザクションを使用したソリューションは正常に機能します。

私の質問: サーバー側で TimeoutException を検出するにはどうすればよいですか? プロキシのステータスに関連するものだと思います...または、おそらくサーバーによってキャプチャできるいくつかのイベントです。サーバー側でトランザクションを処理することが正しい解決策であるかどうかはわかりません..この問題を解決するパターンはありますか?

ありがとう!

4

1 に答える 1

0

操作がタイムアウトするのを待つ代わりに、次のブログ記事のように非同期操作を使用することを検討できます。 -wcf-イベントベースのモデル/

アイデアは、操作に時間がかかることを正確に予測することです。ジョブが完了すると、サーバーはクライアントに通知します。

于 2010-12-09T14:12:41.620 に答える