MVC 3 RTM.我有一个返回文件的动作(image / jpeg).我试图为一个文件设置ETag没有成功(etag没有通过标题).我已经尝试了Response.Cache.SetETag和Response.AppenderHeader.如果我添加自己的自定义标头标签,它按预期工作,它似乎是我无法设置的ETag.
这是来源.
[HttpGet,OutputCache(Location= OutputCacheLocation.Client,VaryByParam="userId",Duration=3600,NoStore=true)] public ActionResult GetImage(string userId) { byte[] result; using (var client = new WebClient()) { client.Credentials = CredentialCache.DefaultCredentials; result = client.DownloadData(string.Format(IntranetUrl,userId)); } Response.Cache.SetETag("00amyWGct0y_ze4lIsj2Mw"); //or Response.AppendHeader("ETag","00amyWGct0y_ze4lIsj2Mw"); Response.AppendHeader("MyHeader","HelloWorld"); return File(result,"image/jpeg"); }
这是资源请求/响应:
> Request > URL:http://localhost/MyApp/Employee.mvc/GetImage?userId=myUserId > Request Method:GET Status Code:200 OK > Request Headers Accept:*/* > Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 > Accept-Encoding:gzip,deflate,sdch > Accept-Language:en-US,en;q=0.8 > Cache-Control:max-age=0 > Connection:keep-alive > Cookie:ASP.NET_SessionId=mySessionId > Host:localhost > Referer:http://localhost/MyApp/Employee/Review/24/Index > User-Agent:Mozilla/5.0 (Windows; U; > Windows NT 5.1; en-US) > AppleWebKit/534.13 (KHTML,like Gecko) > Chrome/9.0.597.98 Safari/534.13 Query > String Parameters userId:myUserId > Response Headers > Cache-Control:private,no-store,> max-age=3600 Content-Length:1428 > Content-Type:image/jpeg Date:Thu,17 > Feb 2011 15:45:30 GMT Expires:Thu,17 > Feb 2011 16:45:29 GMT > Last-Modified:Thu,17 Feb 2011 > 15:45:29 GMT MyHeader:HelloWorld > Server:Microsoft-IIS/5.1 > X-AspNet-Version:4.0.30319 > X-AspNetMvc-Version:3.0 > X-Powered-By:ASP.NET
更新
行动:
public FileETagActionResult GetImage() { return new FileETagActionResult(); }
的ActionResult:
public class FileETagActionResult : ActionResult { public override void ExecuteResult(ControllerContext context) { byte[] result; using (var client = new WebClient()) { result = client.DownloadData("http://myintranet/images/logo.png"); } var hash = MD5.Create().ComputeHash(result); string etag = String.Format("\"{0}\"",Convert.ToBase64String(hash)); TimeSpan expireTs = TimeSpan.FromDays(5); context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.Private); context.HttpContext.Response.Cache.SetETag(etag); context.HttpContext.Response.Cache.SetExpires(DateTime.Now.AddDays(5)); context.HttpContext.Response.Cache.SetMaxAge(expireTs); context.HttpContext.Response.ContentType = "image/png"; context.HttpContext.Response.BinaryWrite(result); } }