4

IIS で実行されている WCF サーバーを作成して、別のコンピューター上の他のプラットフォームで使用することに直面しています。多数のオブジェクト (シリアル化) をクライアントに返す必要があります。DB からすべてのデータを取得し、クライアントの要件に従って配置するのは非常に長いプロセスであるため、ストリーミングする必要があります。

この件についていくつか読んだ後、transferMode StreamedResponseでWCFを使用すると、遅延実行でオブジェクトを返すことができ、これが私のニーズに答えるかもしれません。

次の記事を読みました: http://weblogs.asp.net/cibrax/archive/2008/06/10/streaming-large-content-with-wcf-and-deferred-execution.aspx

彼らが説明するものと同様のWCFを実装しました。ただし、コードを次のように変更しました。

for(long i = 0; i < 1000; i++) //All the customers should be read from the database
{
   yield return new Customer { FirstName = "Foo", LastName = "Bar", Address = "FooBar 123" };
}

に:

for(long i = 0; i < 1000000; i++) //All the customers should be read from the database
{
   yield return new Customer { FirstName = "Foo", LastName = "Bar", Address = "FooBar 123" };
}

したがって、大量のデータをシミュレートします。これを行うと、オブジェクトを返す前にクライアント側の関数が数秒間停止することに気付きました。
なぜこれが起こるのですか?データはすぐにストリームに流れ始めるべきではありませんか? それが遅延実行を伴うストリーミング WCF のポイントではないでしょうか。私の問題に対するより良い提案はありますか?

4

1 に答える 1

1

リンク先のコードを見てみました。

サーバーがデータを返し始める前に、CreateMessage がサーバー上で実行され、結果全体が変数メッセージに配置されているようです。

   Message message = Message.CreateMessage(MessageVersion.Soap11, "GetAllCustomers", new CustomBodyWriter(GetAllCustomersImpl()));
   return message;
于 2012-11-21T20:33:41.450 に答える