File.WriteAllBytes导致错误“系统资源不足,无法完成所请求的服务”

时间:2009-06-15 10:07:22

标签: .net web-services soap

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

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

    File.WriteAllBytes(FilePath, Data);
}

如果此过程传递了一个大文件,例如2 meg它正在轰炸,出现以下错误信息:

  

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

查看我正在获得的堆栈跟踪:

  • 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"/>

上述情况似乎仍有失败。如果您发送一个较小的文件,它会保存到磁盘上。所以它的文件大小或时间都是问题。

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

由于

戴夫

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

我没有看到这可能是由于maxRequestLength造成的。代码位于FileStream.Write的中间,所以很久以前接收数据的任何问题。通过查看调试器中的Data.Length来确认这一点。

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

答案 3 :(得分:0)

maxRequestLength为409600会将数据大小限制为大约400Kb,因此2Mb文件将大大超过此值。

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

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

那么,那是一只红鲱鱼!感谢您的评论,似乎我错了。

答案 4 :(得分:0)

WriteAllBytes在将整个文件写入磁盘之前将其加载到RAM中。你的内存已经不足了。