2009-06-15 11 views
9

Mam standardową usługa mydło z WebMethod która przyjmuje tablicę bajtów, a następnie wykonujeFile.WriteAllBytes powoduje „istnieją zasoby systemowe nie wystarczają do ukończenia żądanej usługi” błąd

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

    File.WriteAllBytes(FilePath, Data); 
} 

Jeśli proces ten przeszedł duży plik, np 2 meg to bombarduje się z następującym komunikatem o błędzie: istnieje

Niewystarczające zasoby systemowe do ukończenia żądanej usługi

Patrząc na ślad stosu Dostaję:

  • System.IO.File.WriteAllBytes
  • System.IO.FileStream.Write
  • System.IO.FileStream.WriteCo Re
  • System.IO .__ Error.WinIOError
  • System.IO.IOException: istnieje mało zasobów systemowych, aby zakończyć therequested usługę

Próbowałem wszystkich oczywistych rzeczy, takich jak ustawienie limitu czasu i realizacji maxRequestLength do bardziej realistycznych ustawień:

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

Nadal wydaje się, że zawodzi z powyższym. Jeśli wyślesz mniejszy plik, to zapisuje się na dysku dobrze. Tak więc chodzi o rozmiar pliku lub czas.

Czy ktoś wie o wszystkim, co mogę zrobić, aby to rozwiązać?

Dzięki

Dave

Odpowiedz

0

maxRequestLength od 409600 ograniczy ilość danych do około 400KB, więc plik 2Mb będzie znacznie przewyższać.

Ludzi powyżej na GuidanceShare omówić dobrze tego rodzaju sytuacji. W skrócie:

  • Jeśli to konieczne, zwiększ maxRequestLength, tak jak przedyskutowałeś.
  • Rozważ implementację przesyłania strumieniowego. W .NET 1.1 użyj klasy, która implementuje IList jako obiekt transferu danych, i ustaw HttpContext.Current.Response.BufferOutput=false; w kodzie po stronie klienta. .NET automatycznie wysyła elementy listy jeden po drugim, więc każdy element listy może być buforem 1K bajtów.
  • Jeśli możesz użyć .NET 2 lub nowszego, rozważ WCF. To implementuje strumieniowanie automatycznie dla powiązań HTTP.

Dobrze, że to czerwony śledź wtedy! Dzięki za komentarze, wydaje się, że się mylę.

+0

Witam. Patrząc na MSDN, mówi, że domyślnie jest 4096 (4 MB) ... Mówi, że jest w kilobajtach .. msdn.microsoft.com/en-us/library/... Czy to źle? – CraftyFella

+0

Działa również dobrze na rozwój i nasze środowisko testowe, co jest bardzo dziwne! – CraftyFella

+0

MaxRequestLength jest w kilobajtach. – OrionRobillard

1

Nie widzę, aby mogło to być spowodowane wartością maxRequestLength. Kod znajduje się pośrodku FileStream.Write, tak długo po jakimkolwiek pytaniu o odbieranie danych. Potwierdź to, patrząc na Data.Length w debugerze.

Dlaczego masz WebMethod (true)? Wypróbuj właśnie [WebMethod] i zobacz, co się stanie.

+0

Witam, Tak, potwierdziłem, że serwer otrzymuje dane w porządku. Przekazuję sumę kontrolną w rzeczywistej wersji na żywo, aby potwierdzić, że otrzymane bajty są takie same jak bajty przeszłości wprowadzone przez klienta. Spróbuję sugestii webMethod i skontaktuję się z Tobą. Dzięki – CraftyFella

+0

BTW ... Samo użycie [webmethod] niczego nie zmieniło. – CraftyFella

0

WriteAllBytes ładuje cały plik do pamięci RAM przed zapisaniem go na dysku. Kończy ci się pamięć.

3

wiem, że nie osiągają tej wielkości pliku, ale także mieć świadomość, że File.WriteAllBytes ma limit 64MB pisząc do ścieżek sieciowych - zobacz connect issue

+0

Dzięki .. Wypróbuję proponowane obejście problemu i skontaktuję się z Tobą .. string string = "\\ server \ share \ myfile.pdf"; string tempPath = Path.GetTempFileName() + "." + Path.GetExtension (ścieżka); File.WriteAllBytes (tempPath, plik); File.Move (tempPath, ścieżka); Chciałbym uzyskać odpowiedź na ten temat. :-) Dave – CraftyFella

3

ja otrzymywał podobny komunikat o błędzie podczas korzystania z pliku .WriteAllBytes i zmienił mój kod tak, aby używał FileStream, jak w poniższym przykładzie. Na podstawie komentarzy innych osób, przypuszczam, że FileStream ma mniejszy wpływ na pamięć.

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

To działało świetnie z tym wyjątkiem, że musiałem użyć 'MemoryStream', aby najpierw odczytać źródłową tablicę' byte [] ', a następnie ją posegregować w porcje. Następujący [ten fragmentowy przykład] (http://stackoverflow.com/a/12468420/175679), używając źródła 'MemoryStream'. W moim przypadku IIS rzuca ten "IOException" podczas zapisu do udziału sieciowego z plikami 20 MB +. – SliverNinja

Powiązane problemy