我想使用 ASP.Net 中的自定义处理程序将文件写回客户端,并想知道以最少的处理时间执行此操作的最佳方法是什么。目前我有两个不同版本的代码执行相同的操作,但由于处理程序将被大量使用,我想知道最有效的方法是什么。
将完整文件加载到字节数组并用于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);
Run Code Online (Sandbox Code Playgroud)
使用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);
Run Code Online (Sandbox Code Playgroud)
我怀疑该TransmitFile方法是最有效的,因为它在不缓冲文件的情况下进行写入。那对象呢FileInfo?它如何计算文件大小?对象是FileInfo做到这一点的最佳方法还是有更好的方法?
FileInfo向文件系统询问文件大小信息(当然,它不需要读取所有内容)。这通常被认为是“昂贵”的操作(与操作内存中的内容和调用方法相比),因为它会影响磁盘。
然而,虽然减少磁盘访问确实是一件好事,但当您准备读取文件的完整内容时,无论如何这不会对总体方案产生影响。所以它本身的性能FileInfo才是你应该关注的。
这里的第一个性能问题是,第一种方法将整个文件保留在内存中,只要客户端下载它——这可能是一个巨大的问题,因为(取决于文件的大小和吞吐量)客户端连接)它有可能大量增加应用程序的内存使用量。如果内存使用量的增加导致交换(即访问磁盘),性能将立即下降。
所以你应该做的是使用TransmitFile——不是因为它在访问磁盘时更快(可能会也可能不会),而是因为它使用更少的内存。
| 归档时间: |
|
| 查看次数: |
7798 次 |
| 最近记录: |