WCFのタイムアウト設定でどはまって、
松崎さんにも助けてもらったのでメモがてら
:やりたかったこと
クライアント側でサーバーに対してリクエストを発行してから
処理結果を受け取りきるまでに渡るタイムアウト値を設定する
:結論
クライアント側のバインディング設定でSendTimeout値を操作すればよい
:困ったこと
いろいろ調べるとWCFのバインディングには基本的なものでも以下の4つがあった
・OpenTimeout
・CloseTimeout
・SendTimeout
・ReceiveTimeout
でも、どれがどういう用途と使われているのかさっぱりわからない。
グーグル大先生Bingに聞いてもさっぱりわからない。
で、泣きついたところ、
OpenTimeoutは、サービスとの接続を確立しようとしたときに発生する例外をどの程度待機するか
CloseTimeoutは、その逆
ReceiveTimeoutは、サービス側で設定するものでどれだけの時間、クライアントからのメッセージ受信待機をするか
SendTimeoutは、その逆
さらにOperationTimeoutというものがあるからそれが、やりたいことに該当するだろうとの助言をいただきました。
いろいろ調べていくと
・OperationTimeoutはIContextChannelクラスのプロパティである
・OperationTimeoutを直接、構成ファイルから設定する方法はないっぽい
ということがわかり、ChannelFactoryを使う場合は以下のようなコードになりました。
ChannelFactory factory = MyCreateFactory<IMyService>(); //アドレス指定、バインディング読み込みなどを行う
IMyService proxy = factory.CreateChannel();
IContextChannel channel = proxy as IContextChannel;
channel.OperationTimeout = new TimeSpan(00, 01, 00); //タイムアウト値の設定
proxy.ExecuteService();
このようにすれば、OperationTimeoutの設定を行え、任意の時間でタイムアウトを設定することができました。
ところで・・・OperationTimeoutの初期値って・・・???
気になったので調べてみたところ、
初期値は 60 秒でした。
SendTimeoutと同じか―と思いながら、構成ファイルでSendTimeoutの値を変更すると・・・
なんとOperationTimeoutの値も変更されておりましたー
ってことは、OperationTimeoutの初期値 = SendTimeoutの設定値ということみたいです。
もちろん、上記、コードを利用して、後からいくらでも変更できましたが
特に支障なければSendTimeoutの設定で流用してもいいかもしれません。