MVC4图像优化缓存按需性能问题

时间:2014-02-11 16:30:47

标签: c# performance asp.net-mvc-4 caching

问题我是否考虑过一些.netASPMVC甚至IIS优化?或者这整个方法只是一个坏主意

SCENARIO

以下适用于0K

我有一个ImageController,允许我动态优化和缓存图像。

实际通话如下:/image/user/1?width=200&height=200

控制器本身就是这样:

[AllowAnonymous] // TODO author/revise
public class ImageController : FileController
{
    private FileResult Image(string entity, long id, int? width, int? height, Position? position=null)
    {
        string file = base.ImageHandler.ImagesPaths(Paths.img, entity, id.ToString()).FirstOrDefault();
        if (string.IsNullOrEmpty(file))
        {
throw new HttpException(404, "File not found");
        }

    // implicit else
        string extension = Path.GetExtension(file);
        System.Drawing.Imaging.ImageFormat oImageFormat = WebFileSystemImageHandler.ImageFormat(extension);

        if ((null != width) || (null != height))
        {
// vvv Beginning of IS THERE SOMETHING WRONG WITH THIS? vvv
            string path       = string.Format("{0}{1}/{2}/", Paths.img, entity, id);
            string pathServer = Server.MapPath(path);
            if (!Directory.Exists(pathServer))
                 Directory.CreateDirectory(pathServer);

            string pattern = "";
            if (null != width ) pattern += width.ToString();        // 500
            if (null != height) pattern += "x" + height.ToString(); // 500x400, or x400 w/o width

            string cache = Directory.GetFiles(pathServer, pattern).FirstOrDefault();
// ^^^ End of IS THERE SOMETHING WRONG WITH THE ABOVE ^^^
            if (string.IsNullOrEmpty(cache))
            {// no cache? sure let's get you started!
                Image oImage = System.Drawing.Image.FromStream(  new MemoryStream( System.IO.File.ReadAllBytes(file) )  );
                file = Server.MapPath(path + pattern + extension);
                Bitmap oBitmap = new Bitmap(oImage);
                       oBitmap = oBitmap.Adjust(width:width, height:height, position:position);
                       oBitmap = oBitmap.Compress();
                       oBitmap.Save(file, oImageFormat);
            }
            else
                file = cache;
        }
        MemoryStream oStream = new MemoryStream( System.IO.File.ReadAllBytes(file) );
        string mime = string.Format("image/{0}", extension.Replace(".", ""));
    return new FileContentResult(oStream.ToArray(), mime);
    }

base.ImageHandler.ImagesPaths基本上返回Directory.GetFiles("{folder}\{entity}\", "{id}.*").FirstOrDefault()

问题当我有一个包含多个这些图片的图库页面时,html立即渲染图像显示为空并开始逐个弹出(我想这是因为每个会话1次调​​用控制器)。我希望这可以作为预期行为仅限第一次运行,但每次都会发生

2 个答案:

答案 0 :(得分:1)

我不建议您在MVC中使用GDI进行图像大小调整,因为它不受支持并且如果不小心使用会导致内存泄漏和其他问题(请参阅http://weblogs.asp.net/bleroy/archive/2009/12/10/resizing-images-from-the-server-using-wpf-wic-instead-of-gdi.aspx)。

您应该查看使用Windows Imaging Components等替代方案,或者为了简单起见而使用Imageresizer(http://imageresizing.net/

另见bertrand的后续帖子:http://weblogs.asp.net/bleroy/archive/2010/05/03/the-fastest-way-to-resize-images-from-asp-net-and-it-s-more-supported-ish.aspxhttp://weblogs.asp.net/bleroy/archive/2011/10/22/state-of-net-image-resizing-how-does-imageresizer-do.aspx就实现基于网络的快速调整大小的各种方法提供建议

答案 1 :(得分:1)

作为旁注:

如果您的应用使用HttpSession,请确保使用以下Controller或至少只读禁用该应用,使用:

[SessionState(SessionStateBehavior.ReadOnly)]

这样至少可以并行执行2个请求。

此外,如果图像和大小的数量有限且不会太大,您可以通过在客户端和服务器设置(内存中)使用OutputCache来简化所有这些操作。您可以避免将图像写入物理存储,并且可以在用户之间重复使用已调整大小的输出。