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

Why two requests when I download a file?

我有一个为文件提供服务的操作:

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 的响应没有任何内容。两者都是 return 200 OK 状态码。这正常吗?

我没有发现您的代码有任何问题。我复制了您的代码并尝试重现您面临的问题。但我无法在 Chrome、IE 和 Firefox 中重现。

看起来这个问题是您的 FireFox 浏览器特有的,并且由于某些 plugin/Extension。禁用浏览器中的所有插件并尝试一下,它应该可以。

您的脚本中缺少 e.preventDefault()。这里发生的是你的动作同时被脚本和正常 post 击中。所以如果你把 e.preventDefault() 像下面这样,那么它会阻止浏览器的默认 post 返回并且只有 javascript 的代码会执行你的请求。

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