使用 Awesomium 在 ASP.NET Web 表单回发后自动下载

Automate download after ASP.NET Web Form postback using Awesomium

我有一个使用 ASP.NET Web 表单编写的网页。整个页面正文都包裹在一个 form 标签中,提交后,该标签会回复 Excel 文件而不是 HTML 页面。该页面还包括触发表单提交的 JavaScript。对于这种情况,普通浏览器会询问 Excel 文件的保存位置(Awesomium 也会这样做)。

我无法修改页面,但我想自动下载 Excel 文件。我不能使用 HTTP 客户端,因为上面提到的 JavaScript 计算了很多模拟起来很复杂的东西;每次调用该函数时,它 returns 表单的不同操作值。

我目前正在使用 Awesomium.net,并已将其配置为开始下载。使用 Fiddler 我看到文件的下载正确开始。不幸的是,它似乎没有完成 :(。或者,文件已被检索,但 Awesomium.net 中没有任何变化:没有事件被触发以通知我下载已完成,我不知道在哪里检索这个文件。

我怀疑是因为返回的 mimetype 不是 text/html,而是 application/vnd.ms-excel;我的猜测是 Awesomium 需要一个 HTML 文件并且不知道如何处理 Excel 文件。它试图显示一个 "save as" 模态对话框,但由于它在无头服务中使用,因此没有可用的弹出窗口。

因此,我没有收到任何事件(或者,我在错误的地方查找)并且无法以编程方式确定文件何时到达。

有没有办法解决这个问题?也许拦截所有回复? 我需要以编程方式控制 "save as" 对话框并选择保存文件的位置。

我发现在解决这个问题时还有一些困难 首先:我无法修改 content-disposition header 因为似乎出于我完全不知道的原因,响应没有被我用作代理的 fiddlerSDK 拦截。 不管怎样,幸运的是,请求被拦截了。 所以我的解决方法(非常脏)是在代理中拦截 awesomium 发出的请求,将所有 headers 和 cookie 分开复制并中止它。 Awesomium 现在不再期待任何回复。 但我已经掌握了它用于请求的所有信息。 然后我制作了一个新的 HttpRequestMessage 并使用 HttpClient 发送它。 这样我也可以更好地处理回复,通过直接在内存中处理它而无需将文件保存到磁盘然后再次拾取它。

这次经历不是很愉快,但最终成功了。 幸运的是,这项工作必须每天 运行 一次,因此性能根本不重要,我希望找到更好的解决方案,但找不到比这更好的解决方案。幸运的是,它在 100% 的时间都有效,所以我想我可以 check-in 并争取今晚!