4

我想使用 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最好的方法还是有更好的方法?

4

1 回答 1

5

FileInfo向文件系统询问文件大小信息(当然,它不需要读取所有内容来这样做)。这通常被认为是“昂贵”的操作(与在内存中操作和调用方法相比),因为它会命中磁盘。

然而,虽然减少磁盘访问确实是一件好事,但当您准备读取文件的全部内容时,这不会对整体方案产生影响。所以FileInfo本身的表现才是你应该关注的。

这里的#1 性能问题是第一种方法将整个文件保留在内存中,只要客户端需要下载它——这可能是一个问题,因为(取决于文件的大小和客户端连接)它有可能大量增加应用程序的内存使用量。如果这种增加的内存使用导致交换(即撞击磁盘)性能将立即下降。

所以你应该做的是使用TransmitFile- 不是因为它在进入磁盘时更快(它可能会或可能不会),而是因为它使用更少的内存。

于 2013-03-13T12:23:41.117 回答