gpt4 book ai didi

c# - 模拟页面生命周期从UI层抓取html

转载 作者:太空狗 更新时间:2023-10-30 00:28:54 26 4
gpt4 key购买 nike

我正在使用一个相当大的 .net 网络应用程序。

用户希望能够将报告导出为 PDF。由于报告基于多层数据的聚合,因此获取准确快照的最佳方法是实际拍摄 UI 快照。我可以获取 UI 的 html 并将其解析为 PDF 文件。

由于加载 UI 可能需要长达 30 秒,但结果永远不会改变,所以我希望在后台线程中保存项目后立即缓存 pdf。

我对这种方法的主要担心是,如果我通过 UI,我不得不担心超时。虽然后台线程等可以根据需要持续很长时间,但 aspx 页面只能持续很长时间,直到它们被终止。

我有两个想法来解决这个问题。第一个想法是创建一个加载 UI、覆盖渲染并将渲染数据存储到数据库的 aspx 页面。后台线程会在内部向该页面发出 WebRequest,然后从数据库中获取结果。这显然要考虑到安全性,还需要担心如果 UI 生成时间过长会超时。

另一个想法是创建一个页面对象并在代码中手动填充它,手动调用相关方法,然后从中获取数据。该方法的问题,除了不知道如何去做之外,我担心我可能会忘记调用一个方法或者某些东西可能无法正常工作,因为它实际上并没有与真实的 session 或网络服务器相关联。

在后台线程中模拟页面 UI 的最佳方法是什么?

最佳答案

我知道 3 种可能的解决方案:

IHttpHandler

This question有完整的答案。一般情况下,您可以通过实现自己的可读流和自定义 IHttpHandler 来捕获 Response.Filter 输出。

然而,这不会让您远程捕获页面的输出,它只允许您捕获将预先发送到客户端的 HTML,并且必须调用该页面。因此,如果您使用单独的页面来生成 PDF,则必须调用它。

网络客户端

我能看到的使用 ASP.NET 执行此操作的唯一替代方法是使用阻塞 WebClient 来请求生成 HTML 的页面。获取该输出,然后将其转换为 PDF。在执行所有这些操作之前,您显然可以检查缓存以查看它是否已经存在。

WebClient client = new WebClient();
string result = client.DownloadString("http://localhost/yoursite");

WatiN(或其他浏览器自动化包)

另一种可能的解决方案是 WatiN这为您捕获浏览器的 HTML 提供了很大的灵 active 。这样做的挫折是它需要与桌面交互。这是他们的例子:

using (IE ie = new IE("http://www.google.com"))
{
ie.TextField(Find.ByName("q")).TypeText("WatiN");
ie.Button(Find.ByName("btnG")).Click();

Assert.IsTrue(ie.ContainsText("WatiN"));
}

关于c# - 模拟页面生命周期从UI层抓取html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1731762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com