使用WCF发送大数据,无需流
本文关键字:数据 WCF 使用 | 更新日期: 2023-09-27 18:08:21
我们正在尝试建立一个web服务,可以发送/接收从kb到gb大小的大数据文件。
我知道我们应该使用流来执行,这样就不会导致内存崩溃。
但问题是我们不想改变我们的设计,或者更像,现在我们要试着看看当我们传输大文件时会发生什么,比如150mb的文件在byte[]缓冲传输模式下使用WCF。(我知道是要缓冲整个文件到内存…和崩溃/异常,如果我们传输gb大小的文件…)
但即使这样,他们想看看会发生什么,所以我在WCF配置中有我的wsHttpBinding:
<system.web>
<compilation debug="true"/>
<httpRuntime maxRequestLength="524288"/>
</system.web>
....
<wsHttpBinding>
<binding name="wsHttpBinding1" closeTimeout="00:10:00" openTimeout="00:10:00"
receiveTimeout="00:30:00" sendTimeout="00:30:00" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="52428800" maxReceivedMessageSize="65536000"
messageEncoding="Mtom" useDefaultWebProxy="true">
<security mode="None" />
</binding>
</wsHttpBinding>
然后我的客户端app config:
<wsHttpBinding>
<binding name="WSHttpBinding_IPrintService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="52428800" maxReceivedMessageSize="65536000"
messageEncoding="Mtom" 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="None"/>
</binding>
</wsHttpBinding>
当我传输小数据时,它工作得很好,但是当我试图传输150mb的文件时,它给了我例外:
InnerException ={"无法向传输写入数据connection:对套接字的操作无法执行,原因是系统没有足够的缓冲空间,或者队列被占用满的。"}
我试图增加maxReceivedMessage等,但它仍然有同样的问题....
= = = = = =
编辑:我试图增加上面所有可能的值…2147483647……我可以成功发送一个30mb的文件,但仍然不能发送150mb的....我还尝试使用这个CustomBinding:
<customBinding>
<binding name="LargeCustomBinding"
receiveTimeout="01:00:00"
openTimeout="01:00:00"
closeTimeout="01:00:00"
sendTimeout="01:00:00">
<binaryMessageEncoding
maxReadPoolSize="2147483647"
maxSessionSize="2147483647"
maxWritePoolSize="2147483647">
<readerQuotas
maxArrayLength="2147483647"
maxDepth="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"
maxStringContentLength="2147483647" />
</binaryMessageEncoding>
<httpTransport
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
maxBufferPoolSize="2147483647"/>
</binding>
</customBinding>
但我仍然得到同样的问题....
=========
编辑2:我想我应该关注我如何发送数据,也许我错了,我有一个对象MyData: byte[] LargeData = File.ReadAllBytes(this.LargeDataPath.Text);
MyData.LargeData = new List<KeyValuePair<string, byte[]>>()
{
new KeyValuePair<string, byte[]>("DATA", LargeData)
};
myServiceClient.SendDataAsync( new SendDataRequest(MyData));
应该没有问题吧?我所做的只是在一个列表.....中发送一个大字节[]
您应该使用单独的send方法调用发送较小的数据块。
将要发送的数据放入字节数组。然后实现两端的逻辑,这将知道如何处理大小,并开始以较小的块发送数据,一个接一个。当您发送了整个文件后,它将被连接到客户机上的一个数组中,您将能够进行进一步的处理。
先修复这个问题:
maxStringContentLength="8192"
maxArrayLength="16384"
确保你有
maxStringContentLength="2147483646"
maxArrayLength="2147483646"
在客户端和服务器端。
我通过WCF发送30Mb没有问题。
看看这个