我目前在弄清楚如何使用ImageResizer插件正确使用SQL和DiskCache插件时遇到了问题。
我的命名策略如下:
IIS URL重写模块将 /myimagetitle-4319560-100x100.jpg
重写为/4319560.jpg?id=4319560&title=myimagetitle&height=100&width=100
。
这可以按预期工作。
现在,为了找到图像的文件名,我需要使用SQL翻译id。我创建了一个IVirtualImageProvider
插件,它实现了FileExists
和GetFile
方法。
public IVirtualFile GetFile(string virtualPath, NameValueCollection queryString)
{
var path = this.GetOriginalFilePath(queryString);
return new VirtualFileWrapper(new ProductPhotoVirtualFile(path));
}
public bool FileExists(string virtualPath, NameValueCollection queryString)
{
if (File.Exists(this.GetCachedFilePath(queryString)))
{
return true;
}
if (File.Exists(this.GetOriginalFilePath(queryString)))
{
return true;
}
return false;
}
private string GetCachedFilePath(NameValueCollection queryString)
{
// Get customized cache file path based on the query string
// "cache\4319\560\4319560_w_100_h_100.jpg"
}
private string GetOriginalFilePath(NameValueCollection queryString)
{
// Perform SQL lookup to translate the id from the query to a file name
}
我正在使用DiskCache插件来确保使用IIS等缓存我的图像。
不幸的是,始终运行FileExists
方法,在每个请求上执行SQL。
我想要实现的目标如下:
FileExists
方法之前运行 DiskCache插件,并以这种方式跳过实际的SQL查找(如果文件已缓存)上述任何一种可能和/或我做错了吗?
由于
答案 0 :(得分:0)
FileExists
,因为没有其他方法可以确定哪个IVirtualImageProvider应该对请求负责 - 因此负责提供修改日期和密钥等缓存详细信息。一个更好的名称是IsHandled
实际上,可以放在FileExists方法中,因为稍后在.Open()期间抛出FileNotFoundException也将被处理为404.如果它会阻止另一个IVirtualImageProvider工作,那么放在FileExists中是不行的。 / p>
在您的情况下,如果图像URL采用您期望的格式(即,具有ID,或者位于专用于SQL图像blob的路径结构内),则应该从FileExists返回true。通常,最好使用路径前缀,因为很难可靠地预测更复杂的模式。