SilverlightからWCFWebサービスを呼び出すのが非常に遅いという問題があります。状況は、 http://forums.silverlight.net/t/148027.aspx/1で概説されている状況と非常によく似ています。そのポスターのように、私は単純なSilverlightアプリケーションプロジェクトと単純なコンソールアプリケーションプロジェクトを設定しました。それぞれに、WCFサービスへのサービス参照を追加し、サービスにいくつかのテスト呼び出しを追加しました。ただし、各通話が発信されるまでにかかる時間は大幅に異なります。コンソールアプリは、ミリ秒のオーダーで呼び出しを行います。Silverlightアプリを使用すると、3〜5秒で完了します。
上記にリンクした投稿で、投稿者がバイナリメッセージエンコーディングを使用するようにサービスを変更すると、速度のギャップがなくなりました。ただし、私の状況では、バイナリメッセージエンコーディングとテキストメッセージエンコーディングのどちらを使用しているかに関係なく、大きな速度ギャップが残ります。
この速度の違いの原因は何でしょうか?バイナリエンドポイントを使用するように構成した場合、リクエストとレスポンスの両方がバイナリエンコードされていることをフィドラーで確認しました。また、複数の連続するWebサービス呼び出しを通じて低速が続くことを確認したため、単なるスピンアップ時間ではありません。問題は、Silverlight側のどこかにある必要があります。
これは、時間差を測定するために使用しているコードのスニペットです。
var proxy = new WCFRef.WebServicesClient("binary");
var callbegin = DateTime.Now;
proxy.CallWSMethodAsync();
var callend = DateTime.Now;
var span = callend.Subtract(callbegin);
Debug.WriteLine("call time: " + span.Seconds + "." + span.Milliseconds + " sec");
そのコードでキャプチャされたタイムスパンは、私が話していたスパンであり、コンソール(数ミリ秒)とSL(数秒)の間に大きな違いがあります。