WCF Web服务响应中出现如此多的时间延迟

本文关键字:时间延迟 Web 服务 响应 WCF | 更新日期: 2023-09-27 18:26:44

我有一个WCF Web服务,它向客户端发送(返回)DataTable。现在我在数据表中有47000条记录。在第一次调用时,获取数据花费了太多时间。

我已将生成序列化程序集设置为"on",并在配置文件中尝试使用DefaultWebProxy="false",但问题无法解决。

这是我的app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_I123Services" closeTimeout="00:30:00"
                openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
                bypassProxyOnLocal="false" transactionFlow="false"        hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="500000000"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2000000"
                    maxBytesPerRead="2000000" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:30:00"
                    enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://123.com/123services.svc" binding="wsHttpBinding"
            bindingConfiguration="WSHttpBinding_I123Services" contract="123Services.I123Services"
            name="WSHttpBinding_I123Services" />
    </client>
</system.serviceModel>
</configuration>

有人能帮我找到解决这个问题的办法吗。非常感谢。

WCF Web服务响应中出现如此多的时间延迟

我通过以下方法解决了这个问题,

数据以字节数组的形式返回,而不是压缩后的DataTable。只是使用了下面的部分。

 public byte[] ToByteArray(object o)
    {
        if (o == null)
            return new byte[0];
        using (MemoryStream outStream = new MemoryStream())
        {
            using (GZipStream zipStream = new GZipStream(outStream, CompressionMode.Compress))
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    new BinaryFormatter().Serialize(stream, o);
                    stream.Position = 0;
                    stream.CopyTo(zipStream);
                    zipStream.Close();
                    return outStream.ToArray();
                }
            }
        }
    }

  public object ToObject(byte[] byteArray)
    {
        if (byteArray.Length == 0)
            return null;
        using (MemoryStream decomStream = new MemoryStream(byteArray), ms = new MemoryStream())
        {
            using (GZipStream hgs = new GZipStream(decomStream, CompressionMode.Decompress))
            {
                hgs.CopyTo(ms);
                decomStream.Close();
                hgs.Close();
                ms.Position = 0;
                return new BinaryFormatter().Deserialize(ms);
            }
        }
    }

希望它能帮助任何人。

首先,通过从服务操作返回数据库,您肯定会增加响应大小。看见http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx.

第二,您希望通过网络返回47K行数据,这是什么?这是大量的序列化开销。我很惊讶你的电话只花了26秒就回了。为什么您需要将47K行的数据加载到您的客户端?

这听起来像是在两件事情之间设置了一个服务边界,这两件事情实际上应该在进程中相互运行。在内存中,这么多数据需要几毫秒才能返回。