スポンサーリンク

2011年4月20日水曜日

Silverlight 対応 WCF サービスにおけるタイムアウトと通信量の設定

 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 件のコメント:

コメントを投稿