使用Web服务发送大数据时出现“Out of Memory Exception”。它适用于少量数据。 场景如下: 这里我有一个名为clsMovie的实体类。这里用户上传超过250 MB的大文件。这个文件被转换为数组的字节并分配给clsMovie类的MovieData成员。 当此类的对象传递给具有大量数据(大字节数组)的Web服务时,我得到“Out of Memory Exception”。
代码是:
MovieResponse objM = service.SaveProductMovie(objMovieEnt); // I get "Out of Memory Exception".
[DataContract]
[Serializable]
public class clsMovie
{
[DataMember]
public byte[] MovieData { get; set; }
[DataMember]
public string MovieType { get; set; }
[DataMember]
public int MovieSize { get; set; }
}
我尝试使用WSE 3.0工具,但它在VS 2008中不受支持,而且我搜索了很多,但都是徒劳的。 有人有解决方案吗?
答案 0 :(得分:1)
通过Web服务发送250 MB的数组会消耗大量内存,您需要3倍250 MB的可用内存来处理该阵列。如果您有10个用户上传,会发生什么?除此之外,如果您发送一条肥皂消息(即xml并且每个字节都转换为char + xml标签),则大小为250 MB文件大小的10倍。
有更好的协议然后是webserices来发送大文件,例如你可以使用ftp并在ftp上传完成时通过webserices发送上传文件的名称。或者制作5 MB卡盘并将最后一个夹头放在那里时合并。
答案 1 :(得分:1)
您应该考虑使用Streaming操作。看看这里:
答案 2 :(得分:0)
您可以检查配置文件中的绑定大小配额。
<basicHttpBinding>
<binding name="BasicHttpBinding_ForgotPasswordService" closeTimeout="00:10:00"
openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
</basicHttpBinding>
可以根据您的需要调整maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
。
但在您的个人情况中,我最好考虑WCF的流媒体功能,例如:“Large Data and Streaming in WCF”(MSDN)
<强> [编辑] 强>
考虑一下,如果你达到了配额限制,那么异常很可能会有所不同,并告诉你“超过了最大数组长度配额”或类似的东西。
OutOfMemoryException
可能与至少一个通信系统的实际限制有关。可能的原因可能是某些内存泄漏将数据填充到RAM中而没有正确清理(或足够快)。