- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用一个相当大的 .net 网络应用程序。
用户希望能够将报告导出为 PDF。由于报告基于多层数据的聚合,因此获取准确快照的最佳方法是实际拍摄 UI 快照。我可以获取 UI 的 html 并将其解析为 PDF 文件。
由于加载 UI 可能需要长达 30 秒,但结果永远不会改变,所以我希望在后台线程中保存项目后立即缓存 pdf。
我对这种方法的主要担心是,如果我通过 UI,我不得不担心超时。虽然后台线程等可以根据需要持续很长时间,但 aspx 页面只能持续很长时间,直到它们被终止。
我有两个想法来解决这个问题。第一个想法是创建一个加载 UI、覆盖渲染并将渲染数据存储到数据库的 aspx 页面。后台线程会在内部向该页面发出 WebRequest,然后从数据库中获取结果。这显然要考虑到安全性,还需要担心如果 UI 生成时间过长会超时。
另一个想法是创建一个页面对象并在代码中手动填充它,手动调用相关方法,然后从中获取数据。该方法的问题,除了不知道如何去做之外,我担心我可能会忘记调用一个方法或者某些东西可能无法正常工作,因为它实际上并没有与真实的 session 或网络服务器相关联。
在后台线程中模拟页面 UI 的最佳方法是什么?
最佳答案
我知道 3 种可能的解决方案:
This question有完整的答案。一般情况下,您可以通过实现自己的可读流和自定义 IHttpHandler
来捕获 Response.Filter
输出。
然而,这不会让您远程捕获页面的输出,它只允许您捕获将预先发送到客户端的 HTML,并且必须调用该页面。因此,如果您使用单独的页面来生成 PDF,则必须调用它。
我能看到的使用 ASP.NET 执行此操作的唯一替代方法是使用阻塞 WebClient
来请求生成 HTML 的页面。获取该输出,然后将其转换为 PDF。在执行所有这些操作之前,您显然可以检查缓存以查看它是否已经存在。
WebClient client = new WebClient();
string result = client.DownloadString("http://localhost/yoursite");
另一种可能的解决方案是 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/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!