2

私は単純な DomainService を持っています:

[EnableClientAccess]
public class DomainService1 : IDomainService1
{
    [Query(IsComposable = true)]
    public IEnumerable<int> GetCollection(int from, int count)
    {
        const int max = 100000;
        int[] _collection;

        _collection = new int[max];

        for (int i = 0; i < max; i++)
        {
            _collection[i] = i;
        }

        return _collection.Skip(from).Take(count);
    }
}

クライアント側では、プロキシを生成しました: client

クライアント側でcomose LINQクエリが必要で、サーバー側でそれを実行し、サービスがクエリ結果を返します。

私がする時:

var res1 = client.GetCollection(100, 20).Skip(5).Take(5);

client.GetCollection(100, 20) はサーバー側で実行され、Skip(5) と Take(5) はクライアント側で実行されます。

私がする時:

var res2 = client.GetCollection(100, 90000).Skip(10).Take(10);

例外をスローします:

基になる接続が閉じられました: 接続が予期せず閉じられました。

これは、client.GetCollection(100, 90000) が大きな結果セットを返すためだと思います。

サーバー障害の理由についてより良い情報を得る方法はありますか? サーバー上のクライアントからクエリを実行することは可能ですか? これにより、LinqToEntitiesDomainService が許可されるため、そう思います。しかし、メモリに保存されたオブジェクトのリストにしかアクセスできないため、EFを使用できません。

ありがとうございました。

JPo

4

1 に答える 1

1

例外はほぼ確実に大規模なデータセットが原因であるため、 <binding> 構成で最大バッファー/メッセージ サイズを増やしてみることができます。次に例を示します。

<binding name="MyServiceBinding" maxReceivedMessageSize="6291456" maxBufferSize="6291456">
    <readerQuotas maxArrayLength="6291456" maxStringContentLength="6291456"/>
</binding>

clientserverの両方の configのバインディングにそれらを追加してください。

サーバーで実行するクエリの追加のクライアント定義部分を取得する場合は、代わりに戻り値を IQueryable<int> にする必要がある場合があります。

于 2011-01-22T19:50:19.187 に答える