序列化WCF服务的数组切片

本文关键字:数组 切片 服务 WCF 序列化 | 更新日期: 2023-09-27 18:22:23

我正在向WCF服务发送和从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一次发送一个数组切片而不复制每个块吗

序列化WCF服务的数组切片

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

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

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

如果返回的结果不是大得离谱[1TB],理想情况下应该在一次调用中完成,但您应该特别修改您的配置值maxArrayLength,如下所述以支持此功能:最大阵列长度配额

正如Ben建议的那样,您应该只返回请求的结果,跳过不必要的项目。