2009-04-25 9 views
1

私はImageResult(ActionResultを拡張)を返すコントローラアクションを持っています。このアクションメソッドが最初にパラメータ値Nで呼び出されると、他の結果的な呼び出しはすべて同じパラメータ値Nを持ち、そのパラメータは異なります。私はこれがASP.NET MVCのパラメータキャッシングに関係していると思います。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)%> 
<% } %> 
 

はまた、これらの2つの回避キャッシュを追加しようとしたが、何も起こらなかっ:

 

    context.HttpContext.Response.Cache.SetNoStore(); 
    context.HttpContext.Response.Expires = 0; 
    context.HttpContext.Response.AppendHeader("Pragma", "no-cache"); 
 

答えて

0

問題が見つかりました。 Windsor IoCを使用し、コントローラーをSingletonとして登録/解決することが原因です(これがデフォルトの動作です)。ライフスタイルを過渡的に変更すると、問題が解決しました(他の問題とともに)。

詳細はhereを参照してください。

+0

IOW、この質問は、ASP、キャッシング、またはイメージとは関係ありません。 =] – bzlm

0

私はベハと思ったviourは、アクションのキャッシュ属性を介して「オプトイン」していました。

データアクセス層が正常に動作していることは間違いありませんか?

+0

はい、ViewModelには正しいデータが含まれています。値をページに直接印刷すると、正しく印刷されますが、コントローラのアクションは常に最初に呼び出された値で呼び出されます。 –

関連する問題