尝试在 ImageResizer 中实现 IVirtualImageProvider
Trying to implement IVirtualImageProvider in ImageResizer
我正在尝试按照说明为 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 修改的简短片段:
<resizer>
<plugins>
<add name="MvcRoutingShim" />
<add name="ResizerVirtFolder" />
</plugins>
</resizer>
当我转到 resizer.debug.ashx 时,ImageResizer.Plugins.Basic.ResizerVirtFolder 显示在已注册的插件下,所以我相信这意味着插件已加载。但是,当我在 FileExists 或 GetFile 函数上放置断点时,它没有被触发。
我想使用 VirtualFolder 插件,但它似乎不再包含在下载中。我正在使用 v 3.4.3。
编辑:将 link 添加到调试输出要点 here.
更长的编辑:我应该补充一点,没有显示的图像在他们的请求中没有查询字符串,也没有以任何方式调整大小。这是否意味着 ImageResizer 根本不会查看它们,因此在这种情况下 Virtual Image Provider 的功能将不会执行?
另一个编辑:查看 this 页面,似乎让图像在 ImageResizer 中工作的最简单方法可能是添加不同的前缀而不是 /assets 或 /images,比如 /resize .在这种情况下,我是否应该为 /resize 添加一个忽略路由?我的 CMS 提供了一个路由处理程序,如果我不忽略它,它最终会尝试处理这条路由。
嗯,看来我找到了自己的解决方案。问题是:
return (virtualPath.StartsWith("assets", StringComparison.OrdinalIgnoreCase)
StartsWith 将始终 return false 因为 virtualPath 将以我的主机名开头。切换到 Contains() 语句可以完美地工作。
顺便说一句,很棒的插件!
我正在尝试按照说明为 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 修改的简短片段:
<resizer>
<plugins>
<add name="MvcRoutingShim" />
<add name="ResizerVirtFolder" />
</plugins>
</resizer>
当我转到 resizer.debug.ashx 时,ImageResizer.Plugins.Basic.ResizerVirtFolder 显示在已注册的插件下,所以我相信这意味着插件已加载。但是,当我在 FileExists 或 GetFile 函数上放置断点时,它没有被触发。
我想使用 VirtualFolder 插件,但它似乎不再包含在下载中。我正在使用 v 3.4.3。
编辑:将 link 添加到调试输出要点 here.
更长的编辑:我应该补充一点,没有显示的图像在他们的请求中没有查询字符串,也没有以任何方式调整大小。这是否意味着 ImageResizer 根本不会查看它们,因此在这种情况下 Virtual Image Provider 的功能将不会执行?
另一个编辑:查看 this 页面,似乎让图像在 ImageResizer 中工作的最简单方法可能是添加不同的前缀而不是 /assets 或 /images,比如 /resize .在这种情况下,我是否应该为 /resize 添加一个忽略路由?我的 CMS 提供了一个路由处理程序,如果我不忽略它,它最终会尝试处理这条路由。
嗯,看来我找到了自己的解决方案。问题是:
return (virtualPath.StartsWith("assets", StringComparison.OrdinalIgnoreCase)
StartsWith 将始终 return false 因为 virtualPath 将以我的主机名开头。切换到 Contains() 语句可以完美地工作。
顺便说一句,很棒的插件!