時間がかかる可能性のある操作を含む 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 を検出するにはどうすればよいですか? プロキシのステータスに関連するものだと思います...または、おそらくサーバーによってキャプチャできるいくつかのイベントです。サーバー側でトランザクションを処理することが正しい解決策であるかどうかはわかりません..この問題を解決するパターンはありますか?
ありがとう!