我想使用ASP.Net中的自定义处理程序将文件写回客户端,并想知道以最少的处理时间执行此操作的最佳方法是什么。目前我有2个不同版本的代码执行相同的操作,但由于处理程序将被大量使用,我想知道最有效的方法是什么。
将完整文件加载到字节数组并使用BinaryWrite
写入文件:
string filePath = context.Server.MapPath(context.Request.Url.LocalPath);
Byte[] swfFile = File.ReadAllBytes(filePath);
context.Response.AppendHeader("content-length", Utils.MakeString(swfFile.Length));
context.Response.ContentType = Utils.GetMimeType(Path.GetExtension(filePath));
context.Response.BinaryWrite(swfFile);
使用FileInfo
对象确定文件长度并TransmitFile
写入文件:
string filePath = context.Server.MapPath(context.Request.Url.LocalPath);
FileInfo fileInfo = new FileInfo(filePath);
context.Response.AppendHeader("content-length", Utils.MakeString(fileInfo.Length));
context.Response.ContentType = Utils.GetMimeType(Path.GetExtension(filePath));
context.Response.TransmitFile(filePath);
我怀疑TransmitFile
方法是最有效的,因为它在没有缓冲文件的情况下写入。那个FileInfo
对象怎么样?它如何计算文件大小?并且FileInfo
对象是最好的方法,还是有更好的方法?
答案 0 :(得分:3)
FileInfo
向文件系统询问文件大小信息(当然,它不需要读取所有内容)。这通常被认为是一种“昂贵”的操作(与操作内存中的内容和调用方法相比),因为它会击中磁盘。
然而,尽管减少磁盘访问确实是一件好事,但是当你准备阅读文件的全部内容时,这对于宏观方案来说并没有什么不同。所以FileInfo
本身的表现就是你应该关注的。
这里的第一个性能问题是第一种方法将整个文件保留在内存中,只要客户端下载它 - 这可能是巨大问题,因为(取决于文件的大小和客户端连接的吞吐量),它有可能大大增加应用程序的内存使用量。如果这种增加的内存使用量导致交换(即击中磁盘),性能将立即显示。
所以你应该做的是使用TransmitFile
- 不是因为它在转到磁盘时会更快(它可能会也可能不会),但因为它占用的内存较少。