【问题标题】:Why two requests when I download a file? [closed]为什么我下载文件时有两个请求? [关闭]
【发布时间】:2015-08-15 21:05:14
【问题描述】:

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

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 状态码。这正常吗?

【问题讨论】:

  • 你能发布html吗?特别是form 标签。
  • 我在本地复制了你的代码,但我无法获得第二次命中。代码的其他部分可能会导致问题。
  • chrome 版本 43.0.2357.81
  • 事实上,在 Firefox 中,我尝试过但无法重现您的问题。
  • 你能禁用FF中的所有插件并试一试告诉我,然后我可以将解决方案作为答案发布:-)

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您的脚本中缺少e.preventDefault()。这里发生的是您的操作受到脚本和普通帖子的影响。所以如果你像下面这样输入e.preventDefault(),那么它将阻止浏览器的默认回发,只有javascript的代码会执行你的请求。

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

    【讨论】:

    • 不正确。在 jQuery 处理程序中,return false 表示 1) preventDefault()、2) stopPropagation() 和 3) 立即返回 false。 See here.
    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 2021-12-06
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多