Кэширование параметров изображения ASP.NET MVC - PullRequest
1 голос
/ 25 апреля 2009

У меня есть действие контроллера, которое повторно запускает 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");  

Ответы [ 2 ]

0 голосов
/ 26 апреля 2009

Нашел проблему! Это связано с использованием Windsor IoC и регистрацией / разрешением контроллеров как Singleton (это поведение по умолчанию). Смена образа жизни на Transient устранила проблему (наряду с другими проблемами).

См. здесь для получения дополнительной информации.

0 голосов
/ 25 апреля 2009

Мне показалось, что поведение было "включено" через атрибуты кэширования в действии.

Вы абсолютно уверены, что ваш уровень доступа к данным работает должным образом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...