MVC3中的DiskCache插件imageresizer

时间:2012-02-27 10:50:15

标签: asp.net-mvc image-processing imageresizer image-caching

对于我的MVC项目(图像服务器应用程序),我无法使用imageresizer进行缓存。我可以像这样访问我的图像,图像源可以是FileSystem / Database(Dependency injeciton):

localhost / images / 123.jpg?width = 500
本地主机/图像/ 123?宽度= 500

我有一个MVC 3项目,其路线如

        routes.RouteExistingFiles = true;
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("favicon.ico");

        routes.MapRoute(
            "ImagesWithExtension", // Route name
            "images/{imageName}.{extension}/", // URL with parameters
            new { controller = "Home", action = "ViewImageWithExtension", imageName = "", extension = "", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Images", // Route name
            "images/{imageName}/", // URL with parameters
            new { controller = "Home", action = "ViewImage", imageName = "", id = UrlParameter.Optional } // Parameter defaults
        );

我有两个控制器来处理图像 public ActionResult ViewImageWithExtension(string imageName,string extension){} public ActionResult ViewImage(string imageName){}

当URL如下所示,缓存完成: localhost / images / 123.jpg?width = 500,图像源为FileSystem
localhost / images / 123?width = 500缓存无法工作的图像源是文件系统
localhost / images / 123.jpg?width = 500缓存无效,图像源DB
localhost / images / 123?width = 500缓存无法正常工作,图像源DB

我的网络配置是这样的:

<configSections>
    <section name="resizer" type="ImageResizer.ResizerSection" />   </configSections>


<resizer>
    <!-- Unless you (a) use Integrated mode, or (b) map all reqeusts to ASP.NET, 
         you'll need to add .ashx to your image URLs: image.jpg.ashx?width=200&height=20 
         Optional - this is the default setting -->
    <diagnostics enableFor="AllHosts" />
    <pipeline fakeExtensions=".ashx" />
    <DiskCache dir="~/MyCachedImages" autoClean="false" hashModifiedDate="true" enabled="true" subfolders="32" cacheAccessTimeout="15000" asyncWrites="true" asyncBufferSize="10485760" />
    <cleanupStrategy startupDelay="00:05" minDelay="00:00:20" maxDelay="00:05" optimalWorkSegmentLength="00:00:04" targetItemsPerFolder="400" maximumItemsPerFolder="1000" avoidRemovalIfCreatedWithin="24:00" avoidRemovalIfUsedWithin="4.00:00" prohibitRemovalIfUsedWithin="00:05" prohibitRemovalIfCreatedWithin="00:10" />
    <plugins>
      <add name="DiskCache" />
    </plugins>   </resizer>

我做错了什么或Imageresizer不支持这种情况?如果没有任何好的插件可以使用基于磁盘的映像吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

正如我在同时发布此问题的其他公共论坛中所解释的那样,ImageResizer从头开始支持依赖注入。你试图用更多的依赖注入包装依赖注入,但是向后。

A)ASP.NET MVC 3 and 4 prevent efficient disk caching, by design。您需要使用使用使用ImageResizer HttpModule而不是使用它来获得良好的性能。这意味着使用URL API,而不是您自己的MVC ActionResults包装的Managed API。请收听我的podcast with Scott Hanselman了解更多信息。

B)SqlReader,S3Reader,MongoReader,VirtualFolder和AzureReader都支持动态注入,并且可以(通过一点点配置)使用相同的路径语法。 ImageResizer旨在允许在数据存储之间轻松迁移。

C)您可以使用Config.Current.Pipeline.Rewrite事件使URL API使用您想要的任何语法。这比MVC路线灵活得多(而且越来越少)。

D)如果要添加另一层依赖注入,请实现IPlugin,并动态选择适当的数据存储并从Install方法进行配置。