如何在ASP.NET MVC中有效地提供图像

时间:2014-01-27 04:31:49

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

在Razor中,我有一个循环,可以给我结果。在那个循环中,我有一个提供图像的Url.Action:

foreach (var i in Model.InventoryList)
        {
        <tr>                
            <td style="text-align: center;"><img alt="@i.ProductCode" src="@Url.Action("GetImageThumbnail", "ServiceRequest", new { ProductCode = i.ProductCode })" onclick="showGallery('@i.ProductCode');" /></td>                
        </tr>
        }

所提供的图像取决于该特定行的图像是否存在。如果没有,则提供备用图像。

public ActionResult GetImageThumbnail(string productCode)
    {            
        string filePath = "path_to_product.png";
        Size size = new Size(80, 50);
        if (!System.IO.File.Exists(filePath))
        {
            filePath = "No_image_available.png";
            size = new Size(50, 50);
        }
        using (MemoryStream ms = new MemoryStream()){
            Image image = Image.FromFile(filePath);
            image = ImageHelpers.ResizeImage(image, size);
            image.Save(ms, ImageHelpers.getImageFormat(filePath));
            return File(ms.ToArray(), ImageHelpers.getContentType(filePath));
        }

    }

现在这很好,如果有一些结果,效果会相当快。如果有数千个结果,那么在服务所有这些图像实例时会有一些明显的减速。有更有效的方法吗?

我可能会在模型中提供较少的结果,但这不是我在这个特定问题中的目标。

1 个答案:

答案 0 :(得分:2)

我会说一些选项 -

  • 您可以DiskCache Plugin IIS调整图片大小。而不是动态地进行所有调整大小计算,而是在创建图像时保存已调整大小的图像。稍后,如果您不想要调整大小的图像,可以随时删除它。
  • 其他一些插件,如SourceMemCache,OutputMemCache和SourceDiskCache,也可用于DiskCache插件本身的IIS。
  • 或者,您可以将所有已调整大小的图像写入缓存提供程序,例如Redis.ioSquid
  • Lazy Load images on your page
  • 尝试重新设计您的网页,我的意思是即使它是一个图库页面,尝试使用分页,这样图库中的数千张图片会在一个页面上缩小到几十个。