我有一个带WebMethod的标准SOAP Web服务,它接受一个字节数组,然后执行
[WebMethod(true)]
WriteFile(byte[] Data, string FilePath)
{
File.WriteAllBytes(FilePath, Data);
}
如果此过程传递了一个大文件,例如2 meg它正在轰炸,出现以下错误信息:
存在不足的系统资源 完成所请求的服务
查看我正在获得的堆栈跟踪:
我已经尝试了所有显而易见的事情,例如将maxrequestlength和执行超时设置为更真实的设置:
<httpRuntime maxRequestLength="409600" executionTimeout="900"/>
上述情况似乎仍有失败。如果您发送一个较小的文件,它会保存到磁盘上。所以它的文件大小或时间都是问题。
有谁知道我能做些什么来解决这个问题?
由于
戴夫
答案 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的人们很好地讨论了这种情况。简而言之:
击>HttpContext.Current.Response.BufferOutput=false;
。 .NET将自动逐个发送列表的元素,因此列表的每个元素可能是1K的字节缓冲区。答案 4 :(得分:0)
WriteAllBytes在将整个文件写入磁盘之前将其加载到RAM中。你的内存已经不足了。