ASP.Net 4漏洞文件句柄中的ThreadAbortException?

时间:2012-04-25 20:14:45

标签: .net multithreading exception-handling thread-safety resource-leak

偶尔如果我们的文件服务器很慢并且页面没有按其超时完成,ASP.Net将使用ThreadAbortException命中它。如果在Win32Native.CreateFile中发生这种情况,它会使文件句柄处于锁定状态,直到我们执行iisreset。

这是.NET的一个缺陷吗?有什么我可以做的关于这个简短的想法,如将超时提升到一些巨大的数字...我不认为ThreadAbort.Reset会有所帮助,因为损坏已经完成,我甚至没有返回文件句柄从FileStream自己关闭它。


at Microsoft.Win32.Win32Native.CreateFile(String lpFileName,Int32 dwDesiredAccess,FileShare dwShareMode,SECURITY_ATTRIBUTES securityAttrs,FileMode dwCreationDisposition,Int32 dwFlagsAndAttributes,IntPtr hTemplateFile)

at Microsoft.Win32.Win32Native.SafeCreateFile(String lpFileName,Int32 dwDesiredAccess,FileShare dwShareMode,SECURITY_ATTRIBUTES securityAttrs,FileMode dwCreationDisposition,Int32 dwFlagsAndAttributes,IntPtr hTemplateFile)

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,Boolean useLongPath)

at System.IO.FileStream..ctor(String path,FileMode mode,FileAccess access,FileShare share,Int32 bufferSize,FileOptions options,String msgPath,Boolean bFromProxy)

在System.IO.FileStream..ctor(String path,FileMode mode)

2 个答案:

答案 0 :(得分:1)

看起来您已将此问题提交给Microsoft Connect,并且未在此处更新其答案:

http://connect.microsoft.com/VisualStudio/feedback/details/739044/threadabortexception-in-asp-net-4-during-new-filestream-leaking-file-handle

以下是Microsoft的回复:

  

在ASP.NET中的同步请求中执行长时间运行的操作   不推荐。如果你正在达到超时期限,你可以   选择只是增加配置的请求超时或更改为   使用异步请求,在执行期间不会超时   异步操作,因此不抛出线程中止   异常。

我猜线程中止(或任何异步异常),最终可以并且将会这样做。

但是看起来框架会在打开文件时在内部使用SafeFileHandle,因此垃圾收集器在闲暇时会被它关闭。

答案 1 :(得分:0)

您是通过关闭finally子句还是使用using方法在代码中正确关闭文件?