“System.OutOfMemoryException”,同时将大量数据发送到 Webservice c#
本文关键字:数据 Webservice OutOfMemoryException System | 更新日期: 2023-09-27 18:35:23
在使用Web服务发送大数据时出现"内存不足异常"。它适用于少量数据。场景是这样的:这里我有一个名为clsMovie的实体类。在这里,用户上传超过250 MB的大文件.该文件被转换为数组的字节并分配给clsMovie类的MovieData成员。当此类的对象传递给具有大量数据(数组的大字节)的 Web 服务时,我得到"内存不足异常"。
代码是:
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中不受支持,而且我也用谷歌搜索了很多,但都是徒劳的。有人有解决方案吗?
通过 Web 服务发送 250 MB 的数组会消耗大量内存,您可能需要 3 倍 250 MB 的可用内存来处理该数组。如果您有 10 个用户上传,会发生什么情况?除此之外,如果您制作 soap 消息,则 250 MB 文件的大小约为大小的 10 倍,这是 xml,每个字节都转换为 char + xml 标签。
有更好的协议,然后websererices发送大文件,例如,您可以使用ftp并在ftp上传完成后通过websererices发送上传文件的名称。或者制作 5 MB 的卡盘,并在最后一个卡盘存在时组合。
应考虑使用流式处理操作。看看这里 :
WCF 流式处理:通过 HTTP 上传/下载文件
可以检查配置文件以了解绑定中的大小配额。
<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 的流式处理功能,如下所示:"WCF 中的大数据和流式处理"(MSDN)
[编辑]
考虑一下,如果您达到了配额限制,则异常很可能是不同的,并告诉您"已超过最大阵列长度配额"或类似内容。
OutOfMemoryException
可能与至少一个通信系统的实际限制有关。一个可能的原因可能是一些内存泄漏将数据填充到 RAM 中并且没有正确(或足够快)清理。