2015-09-05 57 views
1

我使用ImageResizer,而客戶端使用此格式查找圖像:http://website/imagehandler.aspx?id=120&width=240&height=300 這是使用文件夾層次結構尋址圖像的另一種方式,因爲我使用id來查找圖像位置。在自定義查詢字符串中使用ImageResizer

以前,我爲我的使用情況寫了一個自定義插件,但我遇到了一些與該解決方案有關的線程安全問題,如下所述:imageresizer-shows-wrong-image。 Nathanael(圖像調整器的開發者)建議我不要使用自定義插件並使用默認的ImageResizingModule。

如何在利用ImageResizer的同時維護我的URL api(在查詢字符串中使用id)?

編輯:

這是多麼我已經開發了我自己的插件

public class MyImageResizerPlugin : IPlugin, IQuerystringPlugin, IVirtualImageProvider 
{ 
    private IVirtualFile _imageVirtualFile; 

    public IPlugin Install(Config c) 
    { 
     c.Plugins.add_plugin(this); 
     return this; 
    } 

    public bool Uninstall(Config c) 
    { 
     c.Plugins.remove_plugin(this); 
     return true; 
    } 

    public bool FileExists(string virtualPath, NameValueCollection queryString) 
    { 
     if (!virtualPath.ToLower().Contains("imagehandler")) 
     { 
      return false; 
     } 
     _imageVirtualFile = new ImageLocalFile(queryString); 
     return _imageVirtualFile.VirtualPath != null; 
    } 

    public IVirtualFile GetFile(string virtualPath, NameValueCollection queryString) 
    { 
     return _imageVirtualFile; 
    } 

    public IEnumerable<string> GetSupportedQuerystringKeys() 
    { 
     return new [] { "id", "width", "height" }; 
    } 

    public class ImageLocalFile : IVirtualFileWithModifiedDate, IVirtualFileSourceCacheKey 
    { 
     private readonly ResizeSettings _query; 
     private readonly int id; 

     public ImageLocalFile(NameValueCollection q) 
     { 
      _query = new ResizeSettings(q); 
      id = _query.get("id", 0); 
      VirtualPath = path of file based on id 
     } 

     public Stream Open() 
     { 
      return new FileStream(VirtualPath, FileMode.Open, FileAccess.Read); 
     } 

     public string VirtualPath { get; private set; } 

     public DateTime ModifiedDateUTC 
     { 
      get 
      { 
       return File.GetCreationTimeUtc(VirtualPath); 
      } 
     } 

     public string GetCacheKey(bool includeModifiedDate) 
     { 
      return VirtualPath + 
        PathUtils.BuildQueryString(NameValueCollectionExtensions.Keep(_query, "id", "width", "height")); 
     } 
    } 
} 

這是我在web.config中

<modules> 
    <add name="ImageResizingModule" type="ImageResizer.InterceptModule" /> 
</modules> 
<rewrite> 
    <rules> 
    <rule name="ImageHandler"> 
     <match url="^imagehandler.*" /> 
     <action type="Rewrite" url="imagehandler.jpg" /> 
    </rule> 
    </rules> 
</rewrite> 

<resizer> 
    <plugins> 
     <add name="ImageUtilities.MyImageResizerPlugin" /> 
    </plugins> 
    <clientcache minutes="10080" /> 
</resizer> 

回答

1

任何插件安裝一次。所以你不應該將_imageVirtualFile存儲在你的插件的私有字段中。在GetFile()方法中評估_imageVirtualFile。

+0

非常感謝你Abouzar。你救了我的命。 – Hojjat

0

A. URL重寫。如果您有低延遲查找表,則可以處理Config.Current.Rewrite事件並更改實際加載的文件。

B.從BlobProviderBase繼承並自己處理I/O。如果圖像不在本地存儲上,這可能是一個選項。看起來你在這條路上遇到了麻煩,但拒絕顯示任何源代碼。也許一個心理學家可以介入並幫助這個人?

+0

正如你問我已經複製了上面的所有相關代碼。由於映像文件位於磁盤上的不同目錄中,我只需使用id參數和設置地址作爲IVirtualFile中的VirtualPath並最終返回'new FileStream(VirtualPath,FileMode.Open,FileAccess.Read )'在IVirtualFile.Open()中。但我仍然有同樣的問題。 – Hojjat

相關問題