Datei.WriteAllBytes Ursachen der Fehler "nicht genügend Systemressourcen, um den angeforderten Dienst auszuführen"
Ich habe eine standard SOAP webservice mit einem WebMethod-das akzeptiert ein byte-array und führt dann eine
[WebMethod(true)]
WriteFile(byte[] Data, string FilePath)
{
File.WriteAllBytes(FilePath, Data);
}
Wenn dieser Prozess übergeben wird eine große Datei, z.B. 2 meg, es ist Bombardierung mit der folgenden Fehlermeldung:
Insufficient system resources exist to
den angeforderten Dienst auszuführen
Blick auf die stack-trace, die ich immer bin:
- System.IO.Datei.WriteAllBytes
- System.IO.FileStream.Schreiben
- System.IO.FileStream.WriteCore
- System.IO.__Fehler.WinIOError
- System.IO.IOException: Insufficient system resources exist to complete therequested service
Ich habe versucht, all die offensichtlichen Dinge wie die Einstellung maxrequestlength und Ausführung timeout zu realistischeren Einstellungen:
<httpRuntime maxRequestLength="409600" executionTimeout="900"/>
Scheint es immer noch Fehler über mit den oben genannten. Wenn Sie senden eine kleinere Datei, speichert es auf die Festplatte in Ordnung.. Also es ist entweder die Dateigröße oder Zeit, das ist das Problem.
Kennt jemand etwas anderes, das ich tun kann, um zu lösen?
Dank
Dave
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß, Sie sind nicht zu erreichen, die Größe der Datei aber auch bewusst sein, dass-Datei.WriteAllBytes hat ein limit von 64 MB beim schreiben auf die Netzwerk-Pfade - finden Sie diese connect-Ausgabe
Ich erhielt eine ähnliche Fehlermeldung bei Verwendung der Datei.WriteAllBytes und veränderte mein code ein FileStream-wie im Beispiel unten. Basierend auf die Kommentare der anderen, meine Vermutung ist, dass die FileStream-hat einen kleineren Arbeitsspeicher.
MemoryStream
Lesen Sie zunächst die Quellebyte[]
array und dann pipe es in Stücke. Gefolgt dieses chunking Beispiel, mit einemMemoryStream
Quelle. In meinem Fall, IIS wirft dieseIOException
beim schreiben auf ein Netzwerk-share mit 20MB+ - Dateien.Ich sehe nicht, dass dies aufgrund der maxRequestLength. Der code ist in der Mitte des FileStream.Schreiben, so lange Vergangenheit keine Frage für den Empfang der Daten. Bestätigen Sie dies durch die Betrachtung der Daten.Länge in den debugger.
Warum haben Sie WebMethod(true)? Probieren Sie es einfach [WebMethod] und sehen was passiert.
WriteAllBytes lädt die gesamte Datei in den RAM-Speicher vor dem schreiben auf die Festplatte. Sie ' re running out of memory.
Ein maxRequestLength von 409600 begrenzen die Größe der Daten um etwa 400 kB, also eine 2Mb-Datei wird erheblich überschreiten Sie diese.Die Leute bei GuidanceShare besprechen Sie diese situation gut. Kurz gesagt:
HttpContext.Current.Response.BufferOutput=false;
im client-seitigen code. .NET wird automatisch an die Elemente der Liste nacheinander ab, so dass jedes element der Liste sein könnte, 1K buffer bytes.Wenn Sie verwenden können .NET 2 oder höher, sollten WCF. Dieser setzt automatisch mit dem streaming, für HTTP-Bindungen.
Gut, das ist ein red herring dann! Danke für die Kommentare, es scheint, dass ich falsch bin.