将大量数据发送到webservice时的'System.OutOfMemoryException'#

时间:2012-05-25 09:52:48

标签: c# asp.net web-services

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

3 个答案:

答案 0 :(得分:1)

通过Web服务发送250 MB的数组会消耗大量内存,您需要3倍250 MB的可用内存来处理该阵列。如果您有10个用户上传,会发生什么?除此之外,如果您发送一条肥皂消息(即xml并且每个字节都转换为char + xml标签),则大小为250 MB文件大小的10倍。

有更好的协议然后是webserices来发送大文件,例如你可以使用ftp并在ftp上传完成时通过webserices发送上传文件的名称。或者制作5 MB卡盘并将最后一个夹头放在那里时合并。

答案 1 :(得分:1)

您应该考虑使用Streaming操作。看看这里:

WCF Streaming: Upload/Download Files Over HTTP

答案 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中而没有正确清理(或足够快)。