2

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

4

3 回答 3

1

通过 web 服务发送一个 250 MB 的数组会消耗大量内存,您可能需要 3 倍于 250 MB 的可用内存来处理该数组。如果你有 10 个用户上传会发生什么?除此之外,250 MB 文件的大小大约是您制作肥皂消息的 10 倍,它是 xml,每个字节都转换为 char + xml 标签。

有比 webserices 更好的协议来发送大文件,例如,您可以使用 ftp 并在 ftp 上传完成后通过 webserices 发送上传文件的名称。或者制作 5 MB 卡盘并在最后一个卡盘存在时组合。

于 2012-05-25T10:33:55.703 回答
1

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

WCF 流式传输:通过 HTTP 上传/下载文件

于 2012-05-25T10:37:21.363 回答
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 的流式传输功能,如下所示:“WCF中的大数据和流式传输”(MSDN)

[编辑]

想一想,如果您达到了配额限制,异常很可能会有所不同,并告诉您“已超出最大数组长度配额”或类似的内容。

一个OutOfMemoryException可能与至少一个通信系统的实际限制有关。一个可能的原因可能是一些内存泄漏将数据填充到 RAM 中并且没有正确清理(或足够快)。

于 2012-05-25T10:49:55.150 回答