为WCF服务序列化阵列片

时间:2014-09-18 09:02:15

标签: c# arrays wcf chunking slice

我正在向WCF服务发送和接收大型对象数组。 我正在将数组拆分成块并发送它们,以便每次调用都不会太大。

代码看起来像这样:

//split data up so there is no "400 - Bad Request" error
int length = 2000;
if (requests.Length > length)
{
    CustomerMatching[] array = new CustomerMatching[length];
    for (int first = 0; first < requests.Length; first += length)
    {
        if (first + length >= requests.Length)
        {
            length = requests.Length - first;
            array = new CustomerMatching[length];
        }

        Array.Copy(requests, first, array, 0, length);

        r += client.RequestCustomerMatchings(array);
    }
}
else
{
    //Should be able to stream the whole dataset in one go
    r = client.RequestCustomerMatchings(requests);
}

这样可以正常工作,但它比一次性发送它要慢得多,我怀疑必须复制整个阵列才能发送它并不会有帮助。

我可以通过WCF一次发送一个数组片而不复制每个块吗?

2 个答案:

答案 0 :(得分:1)

你说这个解决方案 很多 比一次性发送整个东西要慢,但可能有很多原因。例如,您依次发送所有块,一个接一个。根据您的服务逻辑,这可能太慢了。

考虑并行发送请求。这样,您的整体延迟应该减少(但可能不会像单个请求那么小),并且您避免使用大型内存缓冲区,这可能更难以.net处理。

假设Requests.Length与Length相比不是太大(比方说,10-10000次),我非常怀疑复制数组是你的瓶颈。

答案 1 :(得分:0)

如果您的返回结果不是很大[1TB],理想情况下应该在一个单独的调用中完成,但是您应该修改您的配置值,特别是 maxArrayLength ,如下所述,以支持此功能: Maximum array length quota

正如Ben建议你只应该只返回请求的结果并跳过不必要的项目。