我在使用ImageResizer时,客户端会找到这种格式的图片:http://website/imagehandler.aspx?id=120&width=240&height=300 这是使用文件夹层次结构处理图像的另一种方法,因为我使用id来查找图像位置。
以前,我为我的使用情况编写了一个自定义插件,但我遇到了一些线程安全问题,如下所述:imageresizer-shows-wrong-image。 Nathanael(图像缩放器的开发者)建议我不要使用自定义插件并使用默认的ImageResizingModule。
如何在利用ImageResizer的同时维护我的URL api(在查询字符串中使用id)?
编辑:
这就是我开发自己的插件的方法
public class MyImageResizerPlugin : IPlugin, IQuerystringPlugin, IVirtualImageProvider
{
private IVirtualFile _imageVirtualFile;
public IPlugin Install(Config c)
{
c.Plugins.add_plugin(this);
return this;
}
public bool Uninstall(Config c)
{
c.Plugins.remove_plugin(this);
return true;
}
public bool FileExists(string virtualPath, NameValueCollection queryString)
{
if (!virtualPath.ToLower().Contains("imagehandler"))
{
return false;
}
_imageVirtualFile = new ImageLocalFile(queryString);
return _imageVirtualFile.VirtualPath != null;
}
public IVirtualFile GetFile(string virtualPath, NameValueCollection queryString)
{
return _imageVirtualFile;
}
public IEnumerable<string> GetSupportedQuerystringKeys()
{
return new [] { "id", "width", "height" };
}
public class ImageLocalFile : IVirtualFileWithModifiedDate, IVirtualFileSourceCacheKey
{
private readonly ResizeSettings _query;
private readonly int id;
public ImageLocalFile(NameValueCollection q)
{
_query = new ResizeSettings(q);
id = _query.get("id", 0);
VirtualPath = path of file based on id
}
public Stream Open()
{
return new FileStream(VirtualPath, FileMode.Open, FileAccess.Read);
}
public string VirtualPath { get; private set; }
public DateTime ModifiedDateUTC
{
get
{
return File.GetCreationTimeUtc(VirtualPath);
}
}
public string GetCacheKey(bool includeModifiedDate)
{
return VirtualPath +
PathUtils.BuildQueryString(NameValueCollectionExtensions.Keep(_query, "id", "width", "height"));
}
}
}
这就是我在web.config中所拥有的
<modules>
<add name="ImageResizingModule" type="ImageResizer.InterceptModule" />
</modules>
<rewrite>
<rules>
<rule name="ImageHandler">
<match url="^imagehandler.*" />
<action type="Rewrite" url="imagehandler.jpg" />
</rule>
</rules>
</rewrite>
<resizer>
<plugins>
<add name="ImageUtilities.MyImageResizerPlugin" />
</plugins>
<clientcache minutes="10080" />
</resizer>
答案 0 :(得分:1)
任何插件都安装一次。因此,您不应将_imageVirtualFile存储在插件的私有字段中。在GetFile()方法中评估_imageVirtualFile。
答案 1 :(得分:0)
一个。 URL重写。如果您有一个低延迟查找表,则可以处理Config.Current.Rewrite
事件并更改实际加载的文件。
B中。从BlobProviderBase继承并自己处理I / O.如果图像不在本地存储上,则可能是一种选择。您似乎遇到了这条路径的问题,但拒绝显示任何源代码。也许一个通灵者可以介入并帮助这个?