“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中不受支持,而且我也用谷歌搜索了很多,但都是徒劳的。有人有解决方案吗?

“System.OutOfMemoryException”,同时将大量数据发送到 Webservice c#

通过 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 中并且没有正确(或足够快)清理。