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>
有人能帮我找到解决这个问题的办法吗。非常感谢。
我通过以下方法解决了这个问题,
数据以字节数组的形式返回,而不是压缩后的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行的数据加载到您的客户端?
这听起来像是在两件事情之间设置了一个服务边界,这两件事情实际上应该在进程中相互运行。在内存中,这么多数据需要几毫秒才能返回。