目前,我在如何使用ImageResizer插件来正确地使用SQL和DiskCache插件时遇到了问题。
我的命名策略如下:
IIS重写模块将/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方法之前运行,这样,如果文件被缓存,则跳过实际的SQL查找。是否有上述任何一种可能和/或我做错了什么?
谢谢
发布于 2014-05-05 16:48:22
FileExists将始终被调用,因为没有其他方法来确定哪个IVirtualImageProvider应该对请求负责-因此,哪个负责提供缓存细节,比如修改的日期和键。更好的名字是IsHandled
实际上,躺在FileExists方法中是可以的,因为在.Open()期间抛出一个FileNotFoundException也将作为404处理。如果FileExists会阻止另一个IVirtualImageProvider的工作,那么躺在它的内部是不可以的。
在您的例子中,如果图像URL是您所期望的格式(例如,有一个ID,或者在专用于SQL的path结构中),您应该从FileExists返回true。通常最好使用路径前缀,因为很难可靠地预测更复杂的模式。
https://stackoverflow.com/questions/23405691
复制相似问题