将 ImageResizer 与自定义查询字符串一起使用

Using ImageResizer with custom query string

我正在使用 ImageResizer,而客户端查找具有以下格式的图像:http://website/imagehandler.aspx?id=120&width=240&height=300 这是使用文件夹层次结构寻址图像的另一种方式,因为我使用 id 来查找图像位置。

以前,我为我的使用案例编写了一个自定义插件,但我在该解决方案中遇到了一些线程安全问题,如下所述: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>

一个。 URL重写。如果您有低延迟查找 table,您可以处理 Config.Current.Rewrite 事件并更改实际正在加载的文件。

乙。继承自 BlobProviderBase 并自行处理 I/O。如果图像不在本地存储中,这可能是一个选项。看来您在这条路径上遇到了麻烦,但拒绝显示任何源代码。也许通灵者可以介入并帮助解决这个问题?

任何插件安装一次。因此,您不应将 _imageVirtualFile 存储在插件的私有字段中。在 GetFile() 方法中评估 _imageVirtualFile。