我下载文件时为什么要两个请求?

时间:2015-06-02 07:24:21

标签: asp.net asp.net-mvc http-headers

我有一个提供文件的动作:

public override FileContentResult Foo() {
  var someDataAsBytes = ...
  return File(someDataAsBytes, "text/csv", "somefilename.csv");
}

表单很简单:

<form method="get" action="/Foo" id="myForm">
  <button type="submit">Download</button>
</form>

我通过脚本启动下载(因此页面不会更改):

$("#myForm").on("submit", function() {
  window.location.href = $(this).attr("action");
  return false;
});

问题是两个请求被发送到服务器:一个GET和一个HEAD。该操作运行两次,但只提供一次文件。

如何让它只发送一个请求?或者这是正常行为吗?

额外信息:
我在Fiddler中检查了这一点,并且对GET和POST的响应是相同的,除了GET具有非零Content-Length和实际有效载荷数据。对HEAD的回应一无所获。两者都返回200 OK状态代码。这是正常的吗?

2 个答案:

答案 0 :(得分:3)

我认为您的代码没有任何问题。我复制了您的代码并试图重现您所面临的问题。但我无法在Chrome,IE和Firefox中重现。

看起来这个问题特定于你的FireFox浏览器,并且由于一些插件/扩展。禁用浏览器中的所有插件并试一试,它应该可以正常工作。

答案 1 :(得分:0)

您的脚本中缺少e.preventDefault()。这里发生的事情是你的动作被脚本和普通帖子击中。因此,如果您将e.preventDefault()置于下方,则会阻止浏览器的默认回发,只有javascript的代码才会执行​​您的请求。

$("#myForm").on("submit", function(e) {
  e.preventDefault();
  window.location.href = $(this).attr("action");
});