避免使用ImageResizer和DiskCache插件进行SQL查找

时间:2014-05-01 10:09:43

标签: imageresizer imageresizer-diskcache

我目前在弄清楚如何使用ImageResizer插件正确使用SQL和DiskCache插件时遇到了问题。

我的命名策略如下:

IIS URL重写模块将

/myimagetitle-4319560-100x100.jpg重写为/4319560.jpg?id=4319560&title=myimagetitle&height=100&width=100。 这可以按预期工作。

现在,为了找到图像的文件名,我需要使用SQL翻译id。我创建了一个IVirtualImageProvider插件,它实现了FileExistsGetFile方法。

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。

我想要实现的目标如下:

  1. FileExists方法之前运行 DiskCache插件,并以这种方式跳过实际的SQL查找(如果文件已缓存)
  2. 处理缓存文件命名策略,以便其他工具在正确的文件夹中生成图像。
  3. 上述任何一种可能和/或我做错了吗?

    由于

1 个答案:

答案 0 :(得分:0)

始终会调用

FileExists,因为没有其他方法可以确定哪个IVirtualImageProvider应该对请求负责 - 因此负责提供修改日期和密钥等缓存详细信息。一个更好的名称是IsHandled

实际上,可以放在FileExists方法中,因为稍后在.Open()期间抛出FileNotFoundException也将被处理为404.如果它会阻止另一个IVirtualImageProvider工作,那么放在FileExists中是不行的。 / p>

在您的情况下,如果图像URL采用您期望的格式(即,具有ID,或者位于专用于SQL图像blob的路径结构内),则应该从FileExists返回true。通常,最好使用路径前缀,因为很难可靠地预测更复杂的模式。