スポンサーリンク

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 を設定することで無事にタイムアウトも解決しました。

CallMethodAction を継承した Behavior で描画エラー in VS2010

 Silverlight で UI を作成しているとき、Expression Blend の CallMethodAction を継承した Behavior を使用すると、VS2010 のデザイナーで例外が発生する。

 UnresolvedAssemblyException だったかな?

 グーグル先生に聞いてみたら同じような現象を記事にしている方を発見!

CallMethodActionを継承したBehaviorを指定するとVisual Studio 2010のXAMLデザイナで例外が発生する - The Road to C# Master Trapemiya

 で、そちらの記事から参照されているページを確認してみたところ、バグらしい。しかも修正プログラムが公開される予定がない、とのこと。

no title

 引用元の情報では回避策としてエラーが出ないようにコメントアウトせよ、ってことでやりたいことをするためにあーしなさいという内容にはなっていない。

 とはいえ、やはり CallMethodAction を継承した Behavior を作成する必要がある、さぁ、どうしよう。ということで、そのさらに基底クラスである TriggetAction<T> を継承して実装しました。