这是个Web项目(MVC+EF+SQL Server),需求如题。
我用的EF把300万条数据读取到DataTable中,然后用NPOI写入到Excel文件,通过Return File("Excel的路径")返回到前台,让浏览器把这个Excel下载到本地。
现在有1个问题:
查询数据+写入到Excel的时间约50秒,这一段时间前台一直会卡着不动。
我的解决方案是:
1.写个Ajax请求,用于查询和生成Excel。这一步不返回值。
2.同时在创建一个Ajax请求,这个请求会每2秒执行一次,用于判断Excel是否生成完毕。
3.如果Excel生成完毕,则显示一个“下载”按钮,来下载这个Excel
这样做确实解决了页面卡死,但是没隔2秒就发一次请求,太浪费资源。对于这种把数据库数据导出的情况,一般都有什么解决方案,请大神赐教!!!
websocket与客户单建立长连接。服务器生成完EXCEL后通知客户端。如果讲究用户体验,可以实时读取生成进度,显示到页面上,这样更加友好。websocket的出现,就是解决AJAX轮询这种传统方式,以不断访问服务器,来获取实时消息的资源浪费的优化方案。但是,目前支持的浏览器有限,你可以根据实际情况,决定是否运用websocket新方式.
好的,多谢多谢!!!
我的问题是,你从哪里听说的“太浪费资源”?
这种需求,如果仔细分析的话,可以变成下载很快的。
解决方案有两种
1、点击时,生成,耗时很长,等待完成,至于如何等待,如何通知客户端完成。这是第二个话题。
2、预先生成,点击时立即下载。
你说的AJAX轮询是一种方法,
另一种方法是无法是建立一个长连接,服务端完成时通知客户端,无非看起来更加优雅一些。
还有一种方法是完成时发一封邮件给用户,用户点击链接下载。
嗯。
我不满意的是,ajax每2秒就查询一次,服务器来每次都得做出响应,这会增加服务器的压力。