Silverlight 対応 WCF サービスを利用して Silverlight アプリケーションを作成中。
大きなデータを受信するようなサービスを実行すると CommunicationException が発生する。また、サービス側で時間のかかる処理を行うと TimeoutException が発生する。
まずは通信量から。
Silverlight 対応の WCF サービスにおける、通信に利用できる最大サイズは 2147483647 でざっくり 2GB 。バイナリエンコーディングされているだろうし、例え XML 形式のテキストでやりとりしたとしても 2GB は結構でかい。
実装から見てどう考えてもこの容量を超えてるとは考えられない。
ここでの問題は先に挙げた最大サイズ(Web.configで設定できる項目は多々ある)が問題ではなく、オブジェクトで許可される最大のアイテム数が問題となっていた。既定では 65535 。私の環境ではこの数値を大きい値に変更することで解決しました。
設定箇所は behavior の dataContractSerializer 要素の maxItemsInObjectGraph 属性。
次にタイムアウト。
WCF サービスの設定ファイル ServiceReferences.ClientConfig において設定できるタイムアウトは 4 つ。openTimeout、closeTimeout、sendTimeout に receiveTimeout。
送信して受信待ちでタイムアウトするのだろから receiveTimeout を設定すればいいのか?と思ってやってみたが結果は変わらず。
そもそもサービス側で 5 秒待つようにして設定を 3 秒にしてもタイムアウトにならない。
これらの設定は、コード上ではサービスクライアントのオブジェクトと結びつくわけだけど、実際にタイムアウトに関係するのは receiveTimeout ではなく executionTimeout らしい。そして、なんとこれは sendTimeout と同期しているという……分かり辛っ!
というわけで、sendTimeout を設定することで無事にタイムアウトも解決しました。
0 件のコメント:
コメントを投稿