2

ブロブ ストリームから画像をキャッシュする方法を理解するのに苦労しています。
これは私の最初のコードであり、戻り値の画像ファイルをダウンロードするために機能します:

HTML 部分:

<img src="@Url.Action("GetImage", "Asset")?photoId=@SessionData.ProfilePic.PhotoID&type=3"/>  

コントローラ:

public ActionResult GetImage(long photoId, PhotoType type)
{   
    byte[] img = <Code that fetches image byte from blob stream>;
    return File(img, "image/png");            
}

しかし、これはブラウザにキャッシュできません。
URLが次のように思われる場合、私は考えています:

http://stackoverflow.com/Asset/GetImage/1/2  

画像をキャッシュすることができますか?
だから私は別のルートを作成します:

routes.MapRoute(
    "Upload",
    "Asset/GetImage/{photoId}/{type}",
    new { controller = "Asset", action = "GetImage" }
);

次のように画像にアクセスします。

http://stackoverflow.com/Asset/GetImage/1/2
<img src="http://stackoverflow.com/Asset/GetImage/1/2" />

しかし、私はいつも得ます:

Failed to load resource: the server responded with a status of 404 (Not Found)   

今私の質問は次のとおりです。

  1. URLがこのようにフォーマットさhttp://stackoverflow.com/Asset/GetImage/1/2れていると、ブラウザによってキャッシュできるようになったと考えるのは正しいですか?
  2. なぜこのエラーが発生するのですか? Failed to load resource: the server responded with a status of 404 (Not Found)ルートの何が問題になっていますか?

誰かが助けてくれることを願っています。

編集

これは私の完全なルートです:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    "Upload",
    "Asset/GetImage/{photoId}/{type}",
    new { controller = "Asset", action = "GetImage" }
);

var route = routes.MapRoute(
        "Gallery",
        "",
        new { controller = "Auth", action = "Login" },
        new[] { "Project.Areas.Gallery.Controllers" }
    );

route.DataTokens["area"] = "Gallery";  

それでもエラーが発生しますがFailed to load resource: the server responded with a status of 404 (Not Found)、何が間違っているのでしょうか?

EDIT2

私が使用したメタタグのリスト:

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="imagetoolbar" content="false">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4

1 に答える 1

2

以下は私のために働く

アクション方法

[OutputCache(Duration = 20, VaryByParam = "photoId")]
public ActionResult GetImage(long photoId, long type)
{
    byte[] img = System.IO.File.ReadAllBytes(Server.MapPath("~/Images/aspNetHome.png"));
    return File(img, "image/png");
}

HTML

<img src="~/Home/GetImage/1/2" alt="" />

グローバル asax に追加されたルート

routes.MapRoute(
    "Upload",
    "Home/GetImage/{photoId}/{type}",
    new { controller = "Home", action = "GetImage" }
);

Fiddler からの応答ヘッダー

リファラー: http:// localhost /MvcApplicationImageTest/Home/GetImage/1/2*

HTTP/1.1 200 OK
Cache-Control: private, max-age=20
Content-Type: image/png
Expires: Wed, 01 Aug 2012 05:08:25 GMT
Last-Modified: Wed, 01 Aug 2012 05:08:05 GMT
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 01 Aug 2012 05:08:10 GMT
Content-Length: 3736

次のコメントを編集

OutputCacheAttribute が削除されました

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: image/png
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 02 Aug 2012 04:52:02 GMT
Content-Length: 3736

ヘッダーでわかるように、表示されるCache-Controlだけで表示privateされませんCache-Control: no-cache, Expires: -1, Pragma: no-cache

どうにかしてキャッシュを明示的に無効にする必要があると思いますか? ビューまたはレイアウト ページにMETAタグはありますか? 例えば

<meta http-equiv="cache-control" content="no-cache" />

<meta http-equiv="pragma" content="no-cache" />

<meta http-equiv="expires" content="-1" />
于 2012-08-01T05:27:04.570 に答える