首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImageResizer和Diskcache每次都会查询我的IVirtualImageProvider

ImageResizer和Diskcache每次都会查询我的IVirtualImageProvider
EN

Stack Overflow用户
提问于 2013-09-13 10:30:36
回答 1查看 657关注 0票数 0

我正在尝试使用ImageResizer (来自http://imageresizing.net)在ASP.Net MVC 4网站。我创建了一个IVirtualImageProvider来获取远程服务器上的映像(实际上与实体连接到server )。

一切都很好。奇怪的是,对于每个图像请求,我的提供者被调用了两次,但是视觉结果是可以的。

现在,我想测试DiskCache插件。所以Nuget + config..。还有..。一切似乎都是一样的:每次请求都会调用我的远程服务器两次。

有什么我不明白的吗?使用磁盘缓存应该可以防止我的图像和提供者被调用的正常呈现,不是吗?

我的配置:

代码语言:javascript
复制
<resizer>
    <pipeline fakeExtensions=".ashx" vppUsage="Always" />
    <diskCache dir="~/c_dynimages" autoClean="false" hashModifiedDate="true" enabled="true" subfolders="32" cacheAccessTimeout="15000" />

    <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="MvcRoutingShim" />
        <add name="TwinklazDb" />
        <add name="DiskCache" />
    </plugins>
</resizer>

我的插件:

代码语言:javascript
复制
/// <summary>
/// Actually install plugin into plugin collection of ImageReizer
/// </summary>
/// <param name="c">config</param>
/// <returns>this</returns>
public IPlugin Install(Configuration.Config c)
{
    c.Plugins.add_plugin(this);
    return this;
}

/// <summary>
/// Remove plugin from list
/// </summary>
/// <param name="c">ImageResizer configuration</param>
/// <returns>true</returns>
public bool Uninstall(Configuration.Config c)
{
    c.Plugins.remove_plugin(this);
    return true;
}

#endregion

/// <summary>
/// Returns true if virtualPath contains prefix (dynimages/) 
/// </summary>
/// <param name="virtualPath"></param>
/// <param name="queryString"></param>
/// <returns></returns>
public bool FileExists(string virtualPath, System.Collections.Specialized.NameValueCollection queryString)
{
    bool result = false;
    if (virtualPath.StartsWith(PREFIX))
    {
        long id;
        result = long.TryParse(virtualPath.Substring(PREFIX_LENGTH).Replace(".jpg",""), out id);
    }
    return result;
}

/// <summary>
/// Ask binary service to return a file
/// </summary>
/// <param name="virtualPath">Path as read from http request</param>
/// <param name="queryString">Unused</param>
/// <returns>A dbfile</returns>
public IVirtualFile GetFile(string virtualPath, System.Collections.Specialized.NameValueCollection queryString)
{
    long id;
    if (long.TryParse(virtualPath.Substring(PREFIX_LENGTH).Replace(".jpg", ""), out id))
        return new DbFile(virtualPath, Services.Binary.GetBinary(id));
    return null;
}

和DbFile类:

代码语言:javascript
复制
private class DbFile : IVirtualFile
{
    #region Private members

    /// <summary>
    /// virtual path of the file
    /// </summary>
    private string _virtualPath;

    /// <summary>
    /// File content (blob)
    /// </summary>
    private byte[] _content;

    #endregion
    #region Constructor

    /// <summary>
    /// Builds a DBFile from path and content
    /// </summary>
    /// <param name="path">Path to file (as read from http handler)</param>
    /// <param name="content">Content of the file read from database</param>
    public DbFile(string path, byte[] content)
    {
        _virtualPath = path;
        _content = content;
    }

    #endregion

    /// <summary>
    /// Opens a stream on file content and returns it
    /// </summary>
    /// <returns>A memory stream on content array</returns>
    public System.IO.Stream Open()
    {
        return new System.IO.MemoryStream(_content);
    }

    /// <summary>
    /// Gets virtual path
    /// </summary>
    public string VirtualPath
    {
        get { return _virtualPath; }
    }
}

我的请求:

代码语言:javascript
复制
http://localhost:36782/dynimages/1.jpg.ashx?width=100&height=50&mode=stretch

欢迎任何帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-14 17:31:48

将所有工作延迟到调用.Open()

IVirtualImageProvider实现应该将所有工作推迟到调用.Open()为止。

为了准确地派生缓存哈希,需要一个IVirtualFile实例,因为一些提供程序还提供了一个修改的日期来启用失效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18784126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档