【问题标题】:Trying to implement IVirtualImageProvider in ImageResizer尝试在 ImageResizer 中实现 IVirtualImageProvider
【发布时间】:2015-05-14 06:48:15
【问题描述】:

我正在尝试为 ImageResizer 实现一个 IVirtualImageProvider 插件,正如 here. 所解释的那样,我没有发现难以遵循的说明,但是我的任何图像似乎都没有通过插件。我的图像存储在位于 ASP .NET 根目录之外的 Windows 文件夹中。

任何以“assets”或“images”开头的图片路径都应该由插件处理。这是我对 IVirtualImageProvider 和 IVirtualFile 接口的实现:

namespace ImageResizer.Plugins.Basic
{
    public class ResizerVirtFolder : IPlugin, IVirtualImageProvider
    {
        public IPlugin Install(Configuration.Config c)
        {
            c.Plugins.add_plugin(this);
            return this;
        }

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

        public bool FileExists(string virtualPath, System.Collections.Specialized.NameValueCollection queryString)
        {
            return (virtualPath.StartsWith("assets", StringComparison.OrdinalIgnoreCase) || virtualPath.StartsWith("images", StringComparison.OrdinalIgnoreCase));
        }

        public IVirtualFile GetFile(string virtualPath, System.Collections.Specialized.NameValueCollection queryString)
        {
            return new ResizerVirtualFile(virtualPath);
        }
    }

    public class ResizerVirtualFile : IVirtualFile
    {
        public ResizerVirtualFile(string virtualPath)
        {
            this._virtualPath = virtualPath;

        }

        protected string _virtualPath;
        public string VirtualPath
        {
            get { return _virtualPath; }
        }

        public System.IO.Stream Open()
        {
            string sitePath = System.Configuration.ConfigurationManager.AppSettings["PageFilesLocation"];
            _virtualPath = _virtualPath.Contains("assets/") ? _virtualPath.Substring(_virtualPath.IndexOf("assets/") + 7) : _virtualPath;
            string assetPath = Path.Combine(sitePath, _virtualPath.TrimStart('/').Replace("/", @"\"));
            System.IO.FileStream oStream = new FileStream(assetPath, FileMode.Open);
            return oStream;
        }
    }
}

这是我为插件所做的 Web.config 修改的简要 sn-p:

<resizer>
    <plugins>
      <add name="MvcRoutingShim" />
      <add name="ResizerVirtFolder" />
    </plugins>
</resizer>

当我转到 resizer.debug.ashx 时,ImageResizer.Plugins.Basic.ResizerVirtFolder 显示在注册插件下,所以我相信这意味着插件已加载。但是,当我在 FileExists 或 GetFile 函数上放置断点时,它不会被触发。

我想使用 VirtualFolder 插件,但它看起来不再包含在下载中。我正在使用 v 3.4.3。

编辑:添加了调试输出 Gist here. 的链接

更长的编辑:我应该补充一点,未显示的图像在其请求中没有查询字符串,并且没有以任何方式调整大小。这是否意味着 ImageResizer 根本不会查看它们,因此在这种情况下,Virtual Image Provider 的功能将不会执行?

另一个编辑:查看this 页面,似乎让图像在 ImageResizer 中工作的最简单方法可能是添加不同的前缀而不是 /assets 或 /images,例如 /resize。在这种情况下,我是否应该为 /resize 添加忽略路由?我的 CMS 提供了一个路由处理程序,如果我不忽略它,它最终会尝试处理该路由。

【问题讨论】:

    标签: asp.net-mvc imageresizer


    【解决方案1】:

    好吧,看来我找到了自己的解决方案。问题来了:

    return (virtualPath.StartsWith("assets", StringComparison.OrdinalIgnoreCase) 
    

    StartsWith 将始终返回 false,因为 virtualPath 将以我的主机名开头。切换到 Contains() 语句可以完美运行。

    顺便说一句,很棒的插件!

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 2011-01-14
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多