2012-01-06 38 views
11

Gần đây chúng tôi đã bắt đầu nhìn thấy FileNotFoundException bị ném một cách không thường xuyên trong khi deserializing XML. Thông báo là không thể tìm thấy hội đồng tạm thời được sử dụng để ánh xạ từ XML đến mã. Từ tài liệu this có vẻ như điều này có thể xảy ra khi tệp này không thể được tạo bởi Khuôn khổ .NET (tuy nhiên lý do tại sao không được chụp ngay cả trong ngoại lệ bên trong).FileNotFoundException khi Deserializing XML

Đây là ngoại lệ:

Type : System.IO.FileNotFoundException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
Message : Could not find file 'C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll'. 

Tên tập tin khác trên tất cả các lỗi, nhưng lỗi luôn luôn là như nhau, nó bắt nguồn từ đây (full callstack ở phía dưới):

at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace) 
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 
at System.Xml.Serialization.XmlSerializer..ctor(Type type) 

Khi các CSharpCodeGenerator nỗ lực để tạo ra lắp ráp. Chúng tôi đã sử dụng mã này trong sản xuất trong nhiều năm và nó đã rất ổn định. Nó chỉ mới bắt đầu thất bại trong tuần qua. Chúng tôi đã tự hỏi nếu nó có thể có bất cứ điều gì để làm với mới nhất Microsoft security patch vì nó ảnh hưởng đến phiên bản mã của chúng tôi trong .NET 2.0 và .NET 4.0 trên nhiều hệ điều hành (XP và Server 2003).

Lỗi là không thường xuyên và chạy lại quy trình thường khiến nó biến mất. Đây là một ứng dụng dòng lệnh đơn luồng để truy xuất các tệp và chèn chúng vào cơ sở dữ liệu.

Tôi chưa thể tìm thấy bất kỳ ai khác có cùng vấn đề nhưng không bị tách biệt với cùng một dòng mã, chúng tôi có một số địa điểm sử dụng mã số System.Xml.Serialization và chúng tôi đã thấy lỗi này từ mỗi. Mã này cũng không phải là một cái gì đó mà chúng tôi đã thay đổi gần đây.

Bài đăng gần nhất khác mà tôi có thể tìm thấy là this một.

Trên máy ảo QA của chúng tôi, không có trình quét vi-rút nào nên tôi không nghĩ đó là vấn đề với điều đó. Chúng tôi cũng đã thấy vấn đề này trong cả môi trường lưu trữ của chúng tôi và trong một trang web khách hàng riêng biệt.

Chúng tôi đã cố gắng:

  1. Dọn dẹp thư mục tạm này
  2. quyền Kiểm tra trên thư mục tạm (người dùng là quản trị cục bộ trên hộp)
  3. Tạo XmlSerializers.dll bằng cách sử dụng sgen.exe và triển khai chúng vào thư mục ứng dụng (vấn đề vẫn tồn tại như thể .NET Framework không muốn sử dụng các assembly này).

Nếu có bất kỳ ý tưởng hoặc đề xuất nào hữu ích.

Full callstack:

Type : System.IO.FileNotFoundException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
Message : Could not find file 'C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll'. 
Source : mscorlib 
Help link : 
FileName : C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll 
FusionLog : 
Data : System.Collections.ListDictionaryInternal 
TargetSite : Void WinIOError(Int32, System.String) 
Stack Trace : at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) 
at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames) 
at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources) 
at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources) 
at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] sources) 
at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence) 
at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies) 
at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence) 
at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace) 
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 
at System.Xml.Serialization.XmlSerializer..ctor(Type type) 
+0

Ứng dụng có ảnh hưởng đến ứng dụng .Net 2.0 có đọc tệp serial .Net 4.0 không? –

+0

bạn có thể tìm thấy .dll đó nếu bạn thực hiện tìm kiếm cửa sổ ..? và nếu như vậy có thể được GAC hoặc có thuộc tính copylocal thiết lập đúng trong dự án (s) không chắc chắn như thế nào bạn đang tham khảo nó hiện .. GAC cho 2.0 và 4.0 không được chia sẻ họ có riêng của họ GAC FYI – MethodMan

+0

xảy ra, khi VM là IO-ràng buộc? Nếu có, tôi đã thấy điều này trước đây: Không có cách chữa trị nào, nhưng một cách giải quyết khác - buộc một số tệp trên đĩa này và đợi 1ms. –

Trả lời

1

tôi đã gần như cùng một vấn đề với ASP.NET. Lý do là các file DLL tạm thời được viết trong thư mục đó được ghi nhớ ở đâu đó, có thể trong các tham chiếu từ các DLL tạm thời khác.

Giải pháp là xóa tất cả các tệp trong thư mục C:\Documents and Settings\user\Local Settings\Temp. Một số người trong số họ có khả năng bị khóa và bạn cần phải xóa các tập tin trong một vài lần lặp vì các tập tin bị khóa rất có thể là nguồn gốc của một vấn đề (từ kinh nghiệm của tôi). Khi thư mục tạm thời là rõ ràng, tất cả các công trình như dự định một lần nữa (ít nhất là cho tôi).

+0

Chúng tôi đã cố gắng dọn dẹp thư mục tạm thời nhưng chúng tôi vẫn gặp sự cố tương tự. Vấn đề dường như là một thất bại của csc.exe để chuyển các tập tin .pp tạm thời vào hội đồng tại thời gian chạy, tuy nhiên điều này là lẻ tẻ. – Loathian

0

Trình tự sắp xếp XML của Microsoft rất xấu theo đúng nghĩa của nó.Ngoại lệ mà bạn đang nhận được là do .NET tạo ra assembly ngay lập tức mỗi khi bạn tạo một trình serializer XML mới. Để ngăn chặn điều này càng nhiều càng tốt, hãy thực hiện một từ điển với khóa của loại bạn đang cố gắng tuần tự hóa và trình nối tiếp XML làm giá trị. Loại bộ nhớ đệm này sẽ cho phép bạn gặp phải ngoại lệ cơ hội đầu tiên này chỉ lần đầu tiên bạn đang sắp xếp một loại không xác định.

Hãy xem trang web MSDN của Microsoft, XmlSerializer Class. Có một đoạn cho bạn biết những gì tôi vừa nói.

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