【问题标题】:File.WriteAllBytes causes error "Insufficient system resources exist to complete the requested service"File.WriteAllBytes 导致错误“系统资源不足,无法完成请求的服务”
【发布时间】:2009-06-15 10:07:21
【问题描述】:

我有一个带有 WebMethod 的标准 SOAP 网络服务,它接受一个字节数组,然后执行一个

[WebMethod(true)]
WriteFile(byte[] Data, string FilePath)
{

    File.WriteAllBytes(FilePath, Data);
}

如果此过程传递一个大文件,例如2 兆它正在轰炸,并显示以下错误消息:

系统资源不足 完成请求的服务

查看我得到的堆栈跟踪:

  • System.IO.File.WriteAllBytes
  • System.IO.FileStream.Write
  • System.IO.FileStream.WriteCore
  • System.IO.__Error.WinIOError
  • System.IO.IOException:系统资源不足,无法完成请求的服务

我已经尝试了所有显而易见的事情,例如将 maxrequestlength 和执行超时设置为更实际的设置:

<httpRuntime maxRequestLength="409600" executionTimeout="900"/>

它似乎仍然可以通过上述方式进行故障转移。如果您发送一个较小的文件,它可以很好地保存到磁盘上。所以问题在于文件大小或时间。

有谁知道我还能做些什么来解决这个问题?

谢谢

戴夫

【问题讨论】:

    标签: .net web-services soap


    【解决方案1】:

    我知道你没有达到这个文件大小,但也要注意 File.WriteAllBytes 在写入网络路径时限制为 64mb - 请参阅connect issue

    【讨论】:

    • 谢谢.. 我会尝试他们建议的解决方法并回复您.. string path = "\\server\share\myfile.pdf";字符串 tempPath = Path.GetTempFileName() + "." + Path.GetExtension(路径); File.WriteAllBytes(tempPath, file); File.Move(tempPath, 路径);因为我很想能够得到这个问题的答案。 :-) 戴夫
    【解决方案2】:

    我在使用 File.WriteAllBytes 时收到了类似的错误消息,并将我的代码更改为使用 FileStream,如下例所示。根据其他人的cmet,我的猜测是FileStream对内存的影响较小。

            using (FileStream stream = new FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite))
            {
                stream.Write(Data, 0, Data.Length);
                stream.Close();
            }
    

    【讨论】:

    • 这很好用,除了我必须使用MemoryStream 来首先读取源byte[] 数组,然后将其分块输出。关注this chunking example,使用MemoryStream 源。就我而言,IIS 在写入具有 20MB 以上文件的网络共享时会抛出此 IOException
    【解决方案3】:

    我不认为这可能是由于 maxRequestLength。该代码位于 FileStream.Write 的中间,因此早已解决了接收数据的任何问题。通过查看调试器中的 Data.Length 来确认这一点。

    为什么会有 WebMethod(true)?试试 [WebMethod] 看看会发生什么。

    【讨论】:

    • 嗨,是的,我已确认服务器正在接收数据正常。我在实际的实时版本中传递了一个校验和,以确认接收到的字节与客户端过去输入的字节相同。我会尝试 webMethod 建议并回复您。谢谢
    • 顺便说一句...只是使用 [webmethod] 并没有改变任何东西。
    【解决方案4】:

    WriteAllBytes 将整个文件加载到 RAM 中,然后再将其写入磁盘。您的内存不足。

    【讨论】:

      【解决方案5】:

      409600 的 maxRequestLength 会将数据大小限制在 400Kb 左右,因此 2Mb 的文件会大大超过这个值。

      GuidanceShare 的人们很好地讨论了这种情况。简而言之:

      • 如您所讨论的,如有必要,请增加 maxRequestLength。
      • 考虑实施流式传输。在 .NET 1.1 中,使用实现 IList 的类作为数据传输对象,并在客户端代码中设置 HttpContext.Current.Response.BufferOutput=false;。 .NET 会自动逐一发送列表中的元素,因此列表中的每个元素可能是 1K 字节缓冲区。
      • 如果您可以使用 .NET 2 或更高版本,请考虑使用 WCF。这会自动为 HTTP 绑定实现流式传输。

      嗯,那是一个红鲱鱼!感谢cmets,看来我错了。

      【讨论】:

      • 嗨。查看 MSDN,它说默认是 4096 (4MB)... 它说它以千字节为单位.. msdn.microsoft.com/en-us/library/... 是不是错了?
      • 它在开发和我们的测试环境中也能正常工作,这很奇怪!
      • MaxRequestLength 以千字节为单位。
      猜你喜欢
      • 2018-06-21
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2021-01-13
      • 2021-08-18
      相关资源
      最近更新 更多