我一直在使用带有DiskCache插件的基本ImageResizer库。由于磁盘空间的原因,我需要使用CDN来释放网络服务器上的空间。
为了防止创建本地磁盘缓存,根据文档,我添加了enabled
属性并在配置中设置为false
:
<diskcache dir="~/Content/Resize" enabled="false" />
不幸的是,现在,在请求图像时没有任何内容。启用所有例外后,我设法缩小到ImageResizer.Plugins.Basic
中的此例程:
public static void SaveJpeg(Image b, Stream target, int quality)
{
if (quality < 0)
quality = 90;
if (quality > 100)
quality = 100;
using (EncoderParameters encoderParams = new EncoderParameters(1))
{
using (EncoderParameter encoderParameter = new EncoderParameter(Encoder.Quality, (long) quality))
{
encoderParams.Param[0] = encoderParameter;
// NOTE: this would appear to be the trigger
b.Save(target, DefaultEncoder.GetImageCodeInfo("image/jpeg"), encoderParams);
// NOTE
}
}
}
System.NotSupportedException &#34;不支持指定的方法。&#34; &#34;在System.Web.HttpResponseStream.get_Position()&#34;
任何人都可以帮忙解决这个问题吗?
答案 0 :(得分:0)
最新版本(4.1.9)已修复此问题。
这是由于DefaultEncoder
插件试图将图像直接写入响应流。也许.NET Framework中的更改会阻止在响应流上寻求破坏保存例程。
有一种解决问题的方法,包括使用补丁版本的插件(感谢@Ilian Pinzon)。这会在写入响应流之前写入临时流:
private static void SaveJpeg(Image image, Stream target, int quality)
{
if (quality < 0)
quality = 90; //90 is a very good default to stick with.
if (quality > 100)
quality = 100;
using (EncoderParameters p = new EncoderParameters(1))
{
using (EncoderParameter ep = new EncoderParameter(Encoder.Quality, quality))
{
p.Param[0] = ep;
ImageCodecInfo info = ImageResizer.Plugins.Basic.DefaultEncoder.GetImageCodeInfo("image/jpeg");
if (!target.CanSeek)
{
using (MemoryStream ms = new MemoryStream(_streamCopyBuffer))
{
image.Save(ms, info, p);
ms.WriteTo(target);
}
}
else
{
image.Save(target, info, p);
}
}
}
}
我创造了一个快速的n&#39;使用修补程序和配置更改以使用它来绘制插件版本的脏点。
https://gist.github.com/restlessmedia/9401155f40bd12d40d6affb53c4231b5