У меня есть действие контроллера, которое повторно запускает ImageResult (расширяющий ActionResult). Когда этот метод действия вызывается в первый раз со значением параметра N, другие последующие вызовы ВСЕ будут иметь одинаковое значение параметра N, тогда как их параметры различаются. Я думаю, это как-то связано с кэшированием параметров в ASP.NET MVC.
В результате, возвращаемое изображение при вызове действия всегда одинаково, независимо от значения параметра. Есть ли способ обойти это?
Может быть, это что-то, связанное с прямой записью в Response? Вот мой ImageResult:
public class ImageResult : ActionResult
{
public Image Image
{
get; set;
}
public ImageFormat ImageFormat
{
get; set;
}
private static Dictionary FormatMap
{
get; set;
}
static ImageResult()
{
CreateContentTypeMap();
}
public override void ExecuteResult(ControllerContext context)
{
if (Image == null) throw new ArgumentNullException("Image");
if (ImageFormat == null) throw new ArgumentNullException("ImageFormat");
context.HttpContext.Response.Clear();
context.HttpContext.Response.ContentType = FormatMap[ImageFormat];
Image.Save(context.HttpContext.Response.OutputStream, ImageFormat);
}
private static void CreateContentTypeMap()
{
FormatMap = new Dictionary
{
{ ImageFormat.Bmp, "image/bmp" },
{ ImageFormat.Gif, "image/gif" },
{ ImageFormat.Icon, "image/vnd.microsoft.icon" },
{ ImageFormat.Jpeg, "image/Jpeg" },
{ ImageFormat.Png, "image/png" },
{ ImageFormat.Tiff, "image/tiff" },
{ ImageFormat.Wmf, "image/wmf" }
};
}
}
и действие контроллера:
public ActionResult GetCalendarBadge(DateTime displayDate)
{
var bmp = SomeBitmap();
var g = Graphics.FromImage(bmp);
//GDI+ to draw the image.
return new ImageResult { Image = bmp, ImageFormat = ImageFormat.Png };
}
и код вида:
<% foreach(var item in this.Model.News) { %>
<%= Html.Image<NewsController>(o => o.GetCalendarBadge(item.DisplayDate), 75, 75)%>
<% } %>
Также попытался добавить эти два, чтобы избежать кэширования, но ничего не произошло:
context.HttpContext.Response.Cache.SetNoStore();
context.HttpContext.Response.Expires = 0;
context.HttpContext.Response.AppendHeader("Pragma", "no-cache");