代码之家  ›  专栏  ›  技术社区  ›  diadem

模拟页面生命周期,从UI层获取html

  •  4
  • diadem  · 技术社区  · 16 年前

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

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

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

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

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

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

    2 回复  |  直到 16 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

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

    处理程序

    This question Response.Filter 通过实现您自己的可读流和自定义 IHttpHandler .

    这不允许您远程捕获页面的输出,但是,它只允许您捕获将事先发送到客户端的HTML,并且必须调用该页面。所以,如果你使用一个单独的页面来生成PDF,那么就必须称之为。

    网络客户端

    使用ASP.NET实现这一点的唯一替代方法是使用块 WebClient 请求生成HTML的页面。获取输出,然后将其转换为PDF格式。在你做所有这些之前,你可以检查你的缓存,看看它是否已经在那里了。

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

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

    另一个可能的解决办法是 WatiN 这为您捕获浏览器的HTML提供了很大的灵活性。它的缺点是需要与桌面交互。下面是他们的例子:

    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"));
    }
    
        2
  •  3
  •   Randolpho    16 年前

    如果“获取准确快照的最佳方法是实际拍摄UI快照”是真的,那么您需要重构代码。

    构建一个数据提供程序,向UI和PDF生成器提供聚合数据。分层您的系统。

    然后,当构建PDF时,您只有一个位置可供调用,并且没有黑客UI拦截/多线程问题需要处理。

    推荐文章