请求两次返回文件下载

时间:2014-09-05 18:08:18

标签: c# asp.net-mvc entity-framework download

在搜索错误数小时之后,我能够隔离有问题的代码部分。如果我调用此操作,则“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数据记录就会被添加两次。这里发生了什么,我错过了什么?

编辑:添加了图片和点击的类代码

1 个答案:

答案 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
}

Image

Chrome上没有显示弹出窗口。

希望有所帮助。

<强>更新

这是Firefox中的一个漏洞。

Bug 583351 - Firefox sends GET request twice to server for a dynamically-generated small PNG image

Daniel Nunes的评论:

  

这是因为Firefox不会在标签的图标中显示预览图像   如果图像的任何尺寸是1024像素或更高。就是这样   第二个请求来自的favicon。