我一直在使用基本的ImageResizer库和DiskCache插件。由于磁盘空间问题,我需要使用CDN来释放the服务器上的空间。
为了防止按照文档创建本地磁盘缓存,我在配置中添加了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“指定的方法”。“System.Web.HttpResponseStream.get_Position()”
有人能帮忙解决这个问题吗?

发布于 2017-08-17 13:10:19
这在最新版本(4.1.9)中得到了修正。
这是由于DefaultEncoder插件试图将映像直接写入响应流。也许.NET框架中的更改会阻止在响应流上寻找破坏保存例程的响应流。
解决这个问题的方法是使用补丁版本的插件(感谢@Ilian )。这在写入响应流之前写入临时流:
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‘脏gist,它起草了插件的一个版本,并通过修改和配置来使用它。
https://gist.github.com/restlessmedia/9401155f40bd12d40d6affb53c4231b5
https://stackoverflow.com/questions/45729149
复制相似问题