2009-06-15 27 views
9

Tôi có một webservice SOAP tiêu chuẩn với một WebMethod mà chấp nhận một mảng byte và sau đó thực hiện mộtFile.WriteAllBytes gây ra lỗi "tài nguyên hệ thống không đủ tồn tại để hoàn thành dịch vụ được yêu cầu"

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

    File.WriteAllBytes(FilePath, Data); 
} 

Nếu quá trình này được thông qua một tệp lớn, ví dụ 2 meg nó được ném bom ra với thông báo lỗi sau:

tài nguyên hệ thống không đủ để tồn tại hoàn thành dịch vụ yêu cầu

Nhìn vào stack trace tôi nhận được:

  • System.IO.File.WriteAllBytes
  • System.IO.FileStream.Write
  • System.IO.FileStream.WriteCo tái
  • System.IO .__ Error.WinIOError
  • System.IO.IOException: tài nguyên hệ thống không đủ tồn tại để hoàn thành dịch vụ therequested

Tôi đã thử tất cả những điều hiển nhiên như thiết lập các maxRequestLength và thực hiện thời gian chờ đến các cài đặt thực tế hơn:

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

Dường như vẫn không thành công với những điều trên. Nếu bạn gửi một tập tin nhỏ hơn, nó sẽ tiết kiệm cho đĩa tốt .. Vì vậy, đó là một trong hai kích thước tập tin hoặc thời gian đó là vấn đề.

Có ai biết bất kỳ điều gì khác tôi có thể làm để sắp xếp việc này không?

Cảm ơn

Dave

Trả lời

0

Một maxRequestLength của 409.600 sẽ giới hạn kích thước dữ liệu vào khoảng 400KB, do đó, một tập tin 2Mb sẽ rất vượt quá này.

Những người ở trên GuidanceShare thảo luận về loại tình huống này tốt. Tóm lại:

  • Nếu cần tăng maxRequestLength, như bạn đã thảo luận.
  • Cân nhắc triển khai phát trực tuyến. Trong .NET 1.1, sử dụng một lớp thực hiện IList làm đối tượng truyền dữ liệu và đặt HttpContext.Current.Response.BufferOutput=false; trong mã phía máy khách. .NET sẽ tự động gửi các phần tử của danh sách từng cái một, vì vậy mỗi phần tử của danh sách có thể là một bộ đệm byte 1K.
  • Nếu bạn có thể sử dụng .NET 2 trở lên, hãy cân nhắc WCF. Điều này thực hiện tự động truyền trực tuyến cho các ràng buộc HTTP.

Vâng, đó là một cá trích đỏ rồi! Cảm ơn các ý kiến, có vẻ như tôi sai.

+0

Xin chào. Nhìn vào MSDN nó nói rằng mặc định là 4096 (4MB) ... Nó nói nó bằng kilobyte .. msdn.microsoft.com/en-us/library/… Có sai không? – CraftyFella

+0

Ngoài ra nó hoạt động tốt trên phát triển và môi trường thử nghiệm của chúng tôi, rất kỳ quặc! – CraftyFella

+0

MaxRequestLength bằng kilobyte. – OrionRobillard

1

Tôi không thấy rằng điều này có thể là do maxRequestLength. Mã nằm ở giữa FileStream.Write, quá lâu qua bất kỳ câu hỏi nào về việc nhận dữ liệu. Xác nhận điều này bằng cách xem Data.Length trong trình gỡ lỗi.

Tại sao bạn có WebMethod (đúng)? Hãy thử chỉ [WebMethod] và xem những gì sẽ xảy ra.

+0

Xin chào, Có, tôi đã xác nhận máy chủ đang nhận dữ liệu ok. Tôi vượt qua trong một khoản tiền kiểm tra trong phiên bản trực tiếp thực tế, để xác nhận các byte nhận được là giống như các byte trong quá khứ của khách hàng. Tôi sẽ thử đề xuất webMethod và liên hệ lại với bạn. Cảm ơn – CraftyFella

+0

BTW ... Chỉ cần sử dụng [webmethod] không thay đổi bất cứ điều gì. – CraftyFella

0

WriteAllBytes tải toàn bộ tệp vào RAM trước khi ghi vào đĩa. Bạn đang hết bộ nhớ.

3

Tôi biết bạn đang không đạt kích thước tệp này mà còn lưu ý rằng File.WriteAllBytes có một giới hạn của 64mb khi văn bản cho mạng lưới đường lối - xem này connect issue

+0

Cảm ơn .. Tôi sẽ thử cách giải quyết được đề xuất của họ và liên hệ lại với bạn .. đường dẫn chuỗi = "\\ server \ share \ myfile.pdf"; string tempPath = Path.GetTempFileName() + "." + Path.GetExtension (đường dẫn); Tệp.WriteAllBytes (tempPath, tệp); File.Move (tempPath, đường dẫn); Như tôi rất muốn có thể nhận được câu trả lời cho vấn đề này. :-) Dave – CraftyFella

3

Tôi đã nhận được một thông báo lỗi tương tự như khi sử dụng tập tin .WriteAllBytes và thay đổi mã của tôi để sử dụng một FileStream như trong ví dụ bên dưới. Dựa trên ý kiến ​​của người khác, tôi đoán là FileStream có tác động bộ nhớ nhỏ hơn.

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

Điều này làm việc tuyệt vời với ngoại lệ mà tôi đã phải sử dụng một 'MemoryStream' để lần đầu tiên đọc nguồn' byte [] 'mảng và sau đó ống nó ra trong khối. Tiếp theo [ví dụ chunking này] (http://stackoverflow.com/a/12468420/175679), sử dụng nguồn 'MemoryStream'. Trong trường hợp của tôi, IIS ném 'IOException' này khi ghi vào một mạng chia sẻ với 20MB + tệp. – SliverNinja

Các vấn đề liên quan