使用 HttpWebRequest 传输大文件时出现内存不足异常

2024-01-10

使用大文件的 Http.Put 时出现内存不足异常。我正在使用异步模型,如代码所示。我正在尝试将 8K 数据块发送到 Windows 2008 R2 服务器。当我尝试写入超过 536,868,864 字节的数据块时,始终会发生异常。异常发生在下面代码片段中的 requestStream.Write 方法上。

寻找原因?

注意:较小的文件可以放置。如果我写入本地文件流,逻辑也可以工作。在 Win 7 Ultimate 客户端计算机上运行 VS 2010、.Net 4.0。

   HttpWebRequest request = (HttpWebRequest)WebRequest.Create("Http://website/FileServer/filename");
   request.Method = WebRequestMethods.Http.Put;
   request.SendChunked = true;
   request.AllowWriteStreamBuffering = true;
   ...

   request.BeginGetRequestStream( new AsyncCallback(EndGetStreamCallback), state);
   ...

   int chunk = 8192; // other values give same result
   ....

   private static void EndGetStreamCallback(IAsyncResult ar) {
        long limit = 0;
        long fileLength;
        HttpState state = (HttpState)ar.AsyncState;

        Stream requestStream = null;
        // End the asynchronous call to get the request stream.

        try {
            requestStream = state.Request.EndGetRequestStream(ar);
            // Copy the file contents to the request stream.

            FileStream stream = new FileStream(state.FileName, FileMode.Open, FileAccess.Read, FileShare.None, chunk, FileOptions.SequentialScan);

            BinaryReader binReader = new BinaryReader(stream);
            fileLength = stream.Length;

            // Set Position to the beginning of the stream.
            binReader.BaseStream.Position = 0;

            byte[] fileContents = new byte[chunk];

            // Read File from Buffer 
            while (limit < fileLength)
            {
                fileContents = binReader.ReadBytes(chunk);

                // the next 2 lines attempt to write to network and server
                requestStream.Write(fileContents, 0, chunk);   // causes Out of memory after 536,868,864 bytes
                requestStream.Flush();  // I get same result with or without Flush

                limit += chunk;
            }

            // IMPORTANT: Close the request stream before sending the request.
            stream.Close();

            requestStream.Close();
        }
    }

你显然有这个记录的问题 http://support.microsoft.com/kb/908573. When AllowWriteStreamBuffering is true,它缓冲写入请求的所有数据!所以,“解决方案”是将该属性设置为false:

要解决此问题,请将 HttpWebRequest.AllowWriteStreamBuffering 属性设置为 false。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 HttpWebRequest 传输大文件时出现内存不足异常 的相关文章

随机推荐

  • 检测泛型类型是否开放?

    我的程序集中有一堆常规的 封闭的和开放的类型 我有一个查询 我试图从中排除开放类型 class Foo a regular type class Bar
  • 使用数据绑定设置 ImageView 的色调

    我使用数据绑定来设置我的色调ImageView 这运作良好 android tint plantEntity isFavorite color favorite color favorite none gt 问题是android tint已
  • 如何处理 Pandas Dataframe 中的重复条目?

    我有一个包含以下条目的 df ID FIRST NAME FIRST SUBJECT SECOND SUBJECT A2035559 Sometsdf Science A2035559 Sometsdf ENGINEERING A20340
  • 使用数据帧减去字典中列表的值

    我下面有一个数据框 其中包含用户购买的产品 数据集 user age maritalstatus product A Young married 111 B young married 222 C young Single 111 D ol
  • exec() 命令不起作用

    我正在使用 exec 函数在 centos 服务器上运行我的命令 一切正常 直到我使用命令 命令 ffmpeg i 输入视频 mp4 vf fade out 0 5 输出 mp4 该命令正常 因为它通过命令行在服务器上运行 但是当我使用 p
  • Three.js 合并网格但保留单独的材质

    我正在开发一个基于网络服务器的可视化项目 我让它工作并查看我想要的方式 但它比我希望的要慢得多 基本上 它有一个巨大的网格来建模空间 然后各个立方体以不同的颜色显示在网格中 或者如果那里没有任何东西 则当前将其删除 但可以轻松地使用透明材料
  • Rails 4.0.0 - “没有将 nil 隐式转换为字符串”

    刚刚安装了一个全新的 Rails 4 0 0 应用程序 我收到此错误 https gist github com hartator 6404820 https gist github com hartator 6404820 on http
  • 转换 Html 并将文本设置为 Textview

    我正在尝试转换 html 字符串并将其设置为 TextView 但我无法准确执行此操作 这是我的字符串 您好 1 s 您有 2 d条新消息 我在用textview setText Html fromHtml myString 这会生成带有
  • Windows下如何知道复制是否完成?

    我正在编写一个监听位置的工具 最好是远程位置 如果创建了新的文件夹或文件 它会将其下载到本地位置 目前我正在监听远程文件夹FileSystemWatcher 当创建新文件夹 文件时 我启动一个计时器 如果计时器达到 X 分钟 它就会开始将其
  • UIAlertcontroller 作为 Swift 中的操作

    所以我希望弹出一个警报 告诉我一条消息 然后我希望它等待我 直到我按 确定 然后它将继续执行该功能 例如 IBAction Alert let alertController UIAlertController title title me
  • 在 Windows 上托管闪亮的应用程序

    首先我的问题与 如何在 Windows 服务器上托管 Shiny 应用程序 https stackoverflow com questions 46848995 how to host shiny apps on windows serve
  • nslog时间戳

    我想记录设备运动时间戳属性 设备运动位于 CMMotionManager devicemotion timestamp 类中 有任何想法吗 这是我提出的解决方案 因为日期是根据 Apple 文档确定的 时间戳是自电话启动以来的时间量 以秒为
  • 禁用文本选择 UITextView

    我想禁用 UITextView 上的文本选择 到现在为止我所拥有的 已经完成的是 BOOL canPerformAction SEL action withSender id sender UIMenuController sharedMe
  • 错误:boost/scoped_ptr.hpp:使用 libkml 时没有此类文件或目录

    我正在开发一个使用谷歌地图数据库的软件 我搜索了 google 发现一个 C 库可以做到这一点 libkml 我已经下载了一些示例代码website http code google com p libkml source browse t
  • Git Bash shell 无法创建符号链接

    当我尝试从以下位置创建符号链接时Git Bash https superuser com questions 1053633 what is git bash for windows anywayshell 每次都失败 ln s c Use
  • iOS – UILocalNotification 对同一个通知触发了两次

    如果我安排两个UILocalNotifications 并将它们设置为在完全相同的 fireDate 处触发 然后在设备上 这不是模拟器的bug 上的fireDateapplication didReceiveLocalNotificati
  • 无法更新 git 存储库:“sign_and_send_pubkey:不支持相互签名”

    我正在使用 git 存储库 并使用 ssh 密钥与其连接 直到今天都运行良好 我正在执行拉取操作 并收到以下 ssh 错误 sign and send pubkey no mutual signature supported 然后它会要求输
  • 为什么在 C++ 函数中可以返回对象引用?

    这是网站上的示例 http www cplusplus com doc tutorial classes2 http www cplusplus com doc tutorial classes2 我知道这是一个有效的例子 但是 我不明白为
  • 对于无法到达的目的地,ICMP 回显请求/回复的正确流程是什么?

    Goal 我需要能够 ping 网络交换机以确定它是否可用 这是为了告诉用户网络电缆已拔出 网络交换机不可用或网络通信路径中存在其他问题 我意识到这不是一个全面的诊断工具 但有总比没有好 Design 我计划使用带有原始套接字的 ICMP
  • 使用 HttpWebRequest 传输大文件时出现内存不足异常

    使用大文件的 Http Put 时出现内存不足异常 我正在使用异步模型 如代码所示 我正在尝试将 8K 数据块发送到 Windows 2008 R2 服务器 当我尝试写入超过 536 868 864 字节的数据块时 始终会发生异常 异常发生