对于我的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不支持这种情况?如果没有任何好的插件可以使用基于磁盘的映像吗?
提前致谢。
答案 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
方法进行配置。