【问题标题】:'System.OutOfMemoryException' while sending large amount of data to webservice c#'System.OutOfMemoryException'同时将大量数据发送到webservice c#
【发布时间】:2012-05-25 20:23:22
【问题描述】:

使用 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 服务更改为使用分块(例如以 1MB 为单位发送)应该可以消除此错误。使用 Web 服务并发送大量数据并不是真正可行的方法。
  • @Reniuz : 这不是 dat 的副本。
  • @CodingBarfield : 如何分块发送数据?
  • 你配置内存限制了吗?

标签: c# asp.net web-services


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    WCF Streaming: Upload/Download Files Over HTTP

    【讨论】:

      【解决方案3】:

      您可以检查您的配置文件,了解绑定中的大小配额。

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

      【讨论】:

      • 我在配置文件中进行了此更改,但无法正常工作。我使用的是 asp.net webservice 而不是 WCF。
      • 没有内存泄漏。我无法发送大小超过 128MB 的数组字节。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多