在尝试了一天网络上的各种提示之后,我对此一无所知:我有一个最简单的 Flask 应用程序,提供一个静态 600MB 文件供下载。大约 1,5-2 分钟或大约 80-280MB(所以在相同数量的字节或秒之后根本不会)下载停止并且客户端获得 HTTP 500(根据 IIS 日志)。
- 如果我在该 IIS 上从静态网站(根本不涉及 python 或烧瓶)提供相同的文件,则下载完成。
- 如果我在与本地服务器相同的机器上启动烧瓶(当然,通过 localhost 访问它),一切运行良好。
- 如果我在运行 Windows Server 2012R2 和 IIS 8.5 的第二台服务器上提供相同的应用程序,它可以正常工作。
- wfastcgi 日志没有显示任何错误,flask 也没有抛出任何异常。
代码相当简单:
__init_.py:
def create_app():
filename = inspect.getframeinfo(inspect.currentframe()).filename
root_path = os.path.dirname(os.path.abspath(filename))
app = Flask(__name__, root_path=root_path)
return app
app = create_app()
@app.route("/")
def index():
return render_template('index.html')
模板下的index.html :
<html>
<body>
<a href="{{url_for("static", filename="bigfile.bin")}}"> Please download </a>
</body>
</html>
如果还尝试显式使用烧瓶的 send_from_directory -> 相同的区别。
我已将我知道的所有超时设置为至少 5 分钟:ApplicationPool 的超时、站点的连接超时,甚至 system.applicationHost/webLimits 下的连接超时。我也将 minBytesPerSecond 更改为 0。
Web 服务器是安装了 wfastcgi 的 Windows Server 2019 上的 IIS 10。该问题发生在 HTTPS 和 HTTP 上。对于 https:打开或关闭 HTTP/2 没有效果。我在客户端站点上使用了当前的 Firefox、Chrome 和 iOS Safari,没有区别。
版本是:Python 3.6.4(我也尝试过 3.7.x)Flask 1.1.1 Werkzeug 1.0.1 wfastcgi 3.0.0。这些版本与它工作的旧 IIS 8.5 上的版本完全相同。
更改操作系统在这里不是一个选项,更改网络服务器至少会是一个巨大的痛苦。
任何关于如何调试下载失败的位置和原因的建议(我什至不确定此时是否仍涉及烧瓶)将不胜感激。IIS 日志和 wfastcgi 日志都不再给我任何想法。