0

我使用 DTO 对象从我的 WCF 服务传输数据。

这是 DTO 对象:

[DataContract]
public class MatrixDTO : BaseDTO<MatrixDTO, Matrix>
{
    [DataMember]
    public int MatrixID { get; set; }

    [DataMember]
    public int OriginStopID { get; set; }

    [DataMember]
    public string OriginStopCode { get; set; }

    [DataMember]
    public int DestinationStopID { get; set; }

    [DataMember]
    public string DestinationStopCode { get; set; }

    [DataMember]
    public int NumberOfDays { get; set; }
}

我知道我的服务返回了 2116 件物品。这是返回的典型信息:

在此处输入图像描述

如您所见,每个返回的项目中没有很多数据。但我不知道为什么我必须调整我的 web.config 绑定缓冲区以允许 750000 字节!

这是我的 web.config:

      <binding name="WSHttpBinding_IRequestService" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="750000" maxReceivedMessageSize="750000" messageEncoding="Text"
      textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
          algorithmSuite="Default" />
      </security>
    </binding>

这是我的服务:

    public List<MatrixDTO> GetMatrices()
    {
        using (var unitOfWork = UnitOfWorkFactory.Create())
        {
            var matrixRepository = unitOfWork.Create<Matrix>();                
            var matrices = matrixRepository.GetAll();

            var dto = new List<MatrixDTO>();
            AutoMapper.Mapper.Map(matrices, dto);
            return dto;
        }            
    }

有人可以解释我吗?如果我将缓冲区从 750000 减少到 400000,则会收到错误消息:已超出传入消息的最大消息大小配额 (400000)。要增加配额,请在适当的绑定元素上使用 MaxReceivedMessageSize 属性。

我跟踪 WCF 日志文件,发现从我的 WCF 传输的数据约为 721K。20 个字符以下的 2116 个项目怎么可能传输这么多数据?

4

1 回答 1

2

来自MSDN

Windows Communication Foundation (WCF) 默认使用称为 Data Contract Serializer 的序列化引擎来序列化和反序列化数据(将其转换为 XML 或从 XML 转换)

从 DataContractSerializer 出来后,您的“小”对象如下所示:

<?xml version="1.0" encoding="utf-8"?>
<MatrixDTO xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SORepros.Tests">
    <DestinationStopCode>A-ANT</DestinationStopCode>
    <DestinationStopID>3</DestinationStopID>
    <MatrixID>3</MatrixID>
    <NumberOfDays>0</NumberOfDays>
    <OriginStopCode>PAO</OriginStopCode>
    <OriginStopID>1</OriginStopID>
</MatrixDTO>

这是 344 字节。如果您有 2116 个对象,则为 2116 * 344 = 727904 字节,即 710.8 KB。

于 2012-05-05T19:09:11.370 回答