ImageResizer и Diskcache по-прежнему запрашивают мой IVirtualImageProvider каждый раз
Я пытаюсь использовать ImageResizer (с http://imageresizing.net/) на веб-сайте ASP.Net MVC 4. Я создал IVirtualImageProvider для извлечения моих изображений на удаленном сервере (фактически связан с сервером SQL с помощью Entity).
Все хорошо. Что-то странное в том, что мой провайдер вызывается дважды для каждого запроса изображения, но визуальный результат в порядке.
Теперь я хочу протестировать плагин DiskCache. Итак, Nuget + config... и... все, кажется, ведет себя точно так же: мой удаленный сервер продолжает вызываться дважды для каждого запроса.
Есть ли что-то, чего я не понял? Использование diskcache должно помешать нормальному отображению моих изображений и вызову моего провайдера, не так ли?
Мой конфиг:
<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>
Мой плагин:
/// <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:
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; }
}
}
Мой запрос:
http://localhost:36782/dynimages/1.jpg.ashx?width=100&height=50&mode=stretch
Любая помощь приветствуется!
1 ответ
Задержка всей работы до вызова.Open()
Реализации IVirtualImageProvider должны задерживать всю работу до тех пор, пока не будет вызван.Open().
Экземпляр IVirtualFile необходим для DiskCache для точного получения хэша кеша, поскольку некоторые провайдеры также предоставляют измененную дату для включения аннулирования.