在搜索错误数小时之后,我能够隔离有问题的代码部分。如果我调用此操作,则“Hit”数据记录会添加两次(仅当我使用return File(...)
运行时):
public class ShowController : Controller
{
private PictureDBContext ctx = new PictureDBContext();
public ActionResult Pic(string accesscode)
{
var pic = ctx.Pictures.Include(h=>h.Hits)
.Where(p => p.AccessCode == accesscode).FirstOrDefault();
if (pic == null) throw new HttpException(404, "NotFound");
pic.Hits.Add(new Hit { Date = DateTime.Now });
ctx.SaveChanges();
return File(Path.Combine(pic.PhysicalPath + pic.FileName), "image/jpeg");
//return View();
}
}
型号:
public class Picture
{
public int Id { get; set; }
//...props removed for readability
public List<Hit> Hits { get; set; }
}
public class PictureDBContext : DbContext
{
public DbSet<Picture> Pictures { get; set; }
public DbSet<Hit> Hits { get; set; }
}
public class Hit
{
public int Id { get; set; }
public DateTime? Date { get; set; }
//public int Picture_Id { get; set; }
//public Picture Picture { get; set; }
}
正如你所看到的......里面没有魔法。
如果我将return File(...)
替换为return View()
,则数据只会正确插入一次。一旦我使用return File(...)
,Hit数据记录就会被添加两次。这里发生了什么,我错过了什么?
编辑:添加了图片和点击的类代码
答案 0 :(得分:1)
我可以在Firefox 31中复制它(但不能在Chrome 37中复制),不确定发生了什么。在Firefox中,它仅在Chrome中请求两次。
我尝试指定fileDownloadName
参数,它只请求一次,但浏览器中会弹出一个。
public ActionResult Pic()
{
System.IO.File.AppendAllText("D:\\test.txt", "test" + Environment.NewLine);
return File("D:\\Untitled.png", "image/png", "Untitled.png");
^^^
// Add this
}
Chrome上没有显示弹出窗口。
希望有所帮助。
<强>更新强>
这是Firefox中的一个漏洞。
Bug 583351 - Firefox sends GET request twice to server for a dynamically-generated small PNG image
Daniel Nunes的评论:
这是因为Firefox不会在标签的图标中显示预览图像 如果图像的任何尺寸是1024像素或更高。就是这样 第二个请求来自的favicon。