Служба LINQ over WCF (DomainService) - PullRequest
       23

Служба LINQ over WCF (DomainService)

2 голосов
/ 22 января 2011

У меня есть простой 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

Мне нужно составить запрос 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

1 Ответ

1 голос
/ 22 января 2011

Исключение почти наверняка связано с большим набором данных, поэтому вы можете попробовать увеличить максимальный размер буфера / сообщения в конфигурации , например:

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

Убедитесь, что вы добавили их впривязки в конфигурации client и server .

Что касается получения дополнительных клиентских частей запроса для выполнения на сервере, вы можетевместо этого нужно сделать возвращаемое значение IQueryable .

...