我想在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);
使用
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
对象是最好的方法吗?还是有更好的方法?
FileInfo
只是询问文件系统(通常被认为是“昂贵”的,因为它会访问磁盘);这是获取大小的“最佳”方式。但第一种方法会在客户端下载文件所需的时间内将整个文件保存在内存中,这可能会成为一个巨大的问题。 - JonHttpResponse.TransmitFile()
的文档没有提到它是否会通知客户端消息边界(即设置Content-length
头、执行分块、在传输后关闭连接)。我不希望在使用这种方法时需要显式地设置Content-length
头,但我在文档中找不到相关信息。 - CodeCasterContent-length
。我猜这是因为它边读边传输的缘故。 - nunespascal