我想知道哪种方式是通过ASP.net提供图像最快的方式:
//get file path
string filepath = GetFilePath();
Response.TransmitFile(f);
或:
string filepath = GetFilePath();
context.Response.WriteFile(f);
或
Bitmap bmp = GetBitmap()
bmp.Save(Response.OutputStream);
或您能想到的任何其他方法
答案 0 :(得分:3)
TransmitFile scales better since it does not load the file into Application memory
您需要使用大型图像文件进行测试以查看可见的差异,但TransmitFile将输出执行WriteFile。
在任何一种情况下,您都应该使用ashx处理程序而不是aspx页面来提供图像。 aspx有额外的开销,不需要。
还有一件事 - 在发送文件时设置ContentType,或者浏览器可能会将其呈现为二进制乱码。 在BMP的情况下:
context.Response.ContentType = “图像/ BMP”;
答案 1 :(得分:1)
这并不是真正回答你的问题,但asp不是文件服务器,如果你想提供文件使用IIS并获取Asp链接到那些文件,或者你必须使用ASP使用它来重定向到适当的地方
我并不是说不能这样做,但如果你担心表现,你可以考虑走另一条路。
在你拥有的方法中,我认为位图最慢,因为它会创建一个更复杂的对象。
MS似乎有一个不错的解决方案,如果你必须通过asp。
答案 2 :(得分:0)
测试很容易,我建议您设置三个不同的URL来测试不同的机制,然后让客户端(HttpWebRequest / HttpWebResponse或WebClient实例)从所有这些URL下载内容。使用秒表实例为下载计时。
我认为这并不重要,网络延迟将大大超过IO延迟(除非你一直在颠覆硬盘驱动器)。
答案 3 :(得分:0)
有一件事是肯定的 - 这不会像让IIS服务器文件那么快。如果通过asp.net路由请求而不是让IIS提供服务,那么你会引入一堆你不需要的开销。
我可以想象通过asp.net进行路由的唯一原因是出于安全目的;是这样吗?
答案 4 :(得分:0)
根据我的经验,使用TransmitFile(),只要这是你打算发送的唯一内容,听起来就像是。
请注意,这与支持AJAX的ASPX文件不兼容。
答案 5 :(得分:0)
我想你想要出于安全考虑,或者记录某种类型的指标(例如将每次点击记录到数据库中以找出最受欢迎的图像,或者谁正在查看图像等)。 ,或用于URL重写目的。如果没有特别的理由使用ASP.NET来提供图像,那么你应该让IIS像其他人所说的那样处理它。
另外 - 这不能回答你从磁盘读取图像文件时哪种方法最有效的问题,但我想我应该指出这一点:
如果您已经有包含图像的Stream或Bitmap,请使用它直接写入Response.OutputStream
。您肯定希望避免将其写入磁盘,然后在已经拥有Stream的情况下从磁盘读取。