【问题标题】:LINQ over WCF Service (DomainService)LINQ over WCF 服务 (DomainService)
【发布时间】:2011-06-13 18:51:27
【问题描述】:

我有一个简单的 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);
    }
}

在客户端我生成了代理:客户端

我需要在客户端编写 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,因为我只能访问内存中存储的对象列表。

谢谢。

JP

【问题讨论】:

  • 我看不到您在客户端的何处编写查询。
  • leppie,这是他在 GetCollection() 调用之后附加 .Skip(10).Take(10) 的时候。如果他返回的是 IQueryable 而不是 IEnumerable,它应该使该部分能够在服务器上发生。

标签: wcf linq ria wcf-ria-services domainservices


【解决方案1】:

异常几乎肯定是由于数据集较大,因此您可以尝试在 配置中增加最大缓冲区/消息大小,例如:

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

确保将它们添加到 clientserver 的配置中的绑定中。

至于让查询的其他客户端定义部分在服务器上执行,您可能需要将返回值改为 IQueryable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多