【发布时间】:2011-04-07 22:18:19
【问题描述】:
我正在创建一个 MVC 3 应用程序(尽管同样适用于其他技术,例如 ASP.NET 表单)并且只是想知道从代码提供图像而不是使用直接虚拟路径(例如通常)。
我的想法是我将提供文件的常用方法改进为:
- 应用安全检查
- 基于路由值提供文件的标准化方法
- 返回修改后的图像(如果请求),例如不同的维度(好吧,这只会被谨慎使用,所以不要将它与上面的性能问题联系起来)。
- 在允许访问资源之前执行业务逻辑
我知道该怎么做,但我不知道我是否应该这样做。
- 有哪些性能问题(如果有)
- 是否发生了一些奇怪的事情,例如?图像仅按顺序加载(也许这就是 HTML 目前我不确定的方式 - 在这里暴露我的无知)。
- 你能想到的任何其他东西。
希望这一切都有意义!
谢谢, 丹。
更新
好的 - 让我们具体一点:
使用这种方法在 MVC 3 中使用内存流为所有图像提供服务对性能有何影响?注意:图像 url 将是 GenericFetchImage/image1 (为了简单起见 - 我所有的图像都是 jpegs)。
public FileStreamResult GenericFetchImage(string RouteValueRefToImage)
{
// Create a new memory stream object
MemoryStream ms = new MemoryStream();
// Go get image from file location
ms = GetImageAndPutIntoMemoryStream(RouteValueRefToImage);
// return the output as a file
return new FileStreamResult(ms, "image/jpeg");
}
我知道此方法有效,因为我正在使用它根据验证码图像的会话值动态生成图像。它非常简洁 - 但我想将这种方法用于所有图像检索。
我想我想在上面的例子中我想知道这是否可以执行,或者是否需要更多处理才能执行,如果可以,需要多少?例如,如果访问者的数量要乘以 1000,那么服务器是否会在图像传递中承担处理负担..
谢谢!
【问题讨论】:
-
性能和“如果发生奇怪的事情”都完全取决于您构建应用程序的方式......这是非常主观的。
-
性能完全取决于您的交付方式。您打算如何将图像交付给客户。
-
嗨,比尔和 womp - 我已经用一个例子更新了我的问题。我想到了性能影响。
-
IIS 将数据直接从文件流式传输到客户端,因此即使对于许多连接也使用很少的 RAM。如果您每次都将每个文件都缓冲到内存中,那么您将很快耗尽 RAM。 (拨号客户端可能需要几分钟来下载一个小文件,想想tit)..
-
@Levitikon 移动版。将“拨号”替换为“EDGE”或“AT&T 3G”。持久的请求在这里并不是异常,您需要面对它的现实。您不能假装一次只处理一个请求。
标签: asp.net asp.net-mvc image