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

Asked
Viewd467

4

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

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

由于UI可能最多需要30秒的加载时间,但结果永远不会改变,因此我希望在项目保存到后台线程后立即缓存pdf。

我对这种方法的主要担心是,如果我通过UI,则必须担心超时。尽管后台线程之类的内容可以根据需要持续使用多长时间,但是aspx页面只能持续使用很长时间,直到它们终止。

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

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

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

  • @RickNZ:由于需要的工作量,它不在我列表的首位,但是如果您能想到一种解决webrequest可能导致的超时问题以及在后台线程中创建页面的循环问题的方法,原因,我都听不清。

    diademNovember 23, 2009 14:16

2 个答案

6

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

IHttpHandler

此问题具有完整的答案。通用jeste是您通过实现自己的可读流和自定义Response.Filter来捕获IHttpHandler输出。

但是,这不允许您远程捕获页面的输出,它仅允许您捕获将事先发送到客户端的HTML,并且必须调用该页面。因此,如果将单独的页面用于PDF生成,则必须调用该页面。

WebClient

使用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"));
}
 
  • 谢谢。Webrequest是我最初使用的解决方案。它可以在本地机器上完美运行。

    我对这些方法的担心是超时-如果服务器超出正常范围而被重击并且本地调用aspx超时,则可能存在问题。显然,我可以让计时器重试,但是如果用户现在要 ,那不是一个选择。

    diademNovember 23, 2009 14:19
3

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

构建一个数据提供程序,将您的汇总数据同时提供给UI和PDF生成器。对系统进行分层。

然后,当要构建PDF时,您只有一个位置可以调用,而没有处理过的UI拦截/多线程问题。

  • +1,尽管目前可能尚不可行,但至少需要努力。

    Jon SeigelNovember 17, 2009 15:54
  • 我仍然不遵循如何创建视图模型来代替ascx页面中自定义代码的需求-我是说,我要更改样式表?我怎样才能将其级联到每个PDF?那么ascx中继器之类的呢?操纵DOM的JavaScript呢?

    diademNovember 17, 2009 19:27
  • 嗯……也许您应该考虑采用Model-View-ViewModel模式。基本上,为您的“自定义UI逻辑”添加另一层(ViewModel),然后将这些决定放在那里。然后将您的ASPX和PDF渲染器都绑定到该模型和逻辑。

    RandolphoNovember 17, 2009 16:57
  • 由于开发人员缺乏必要的纪律,您将通过筛选PDF来进行艰苦的工作吗?我为你感到;那不是理想的情况。

    RandolphoNovember 17, 2009 16:54
  • 我们第一次进行了此迭代。这变成了维护的噩梦。最终,有人会在用户界面中创建特殊的逻辑,甚至简单到“如果来自法国的商品以不同的方式显示表格,现在将此单元格涂成绿色,在此处更改拼写”,那么它就不会反映在导出中因为ascx和pdf输出都需要匹配,最终事情会变得不同步。对于只想编辑ascx页面,甚至不考虑导出的人来说,这尤其适用,因为这不是他们的工作。

    diademNovember 17, 2009 16:29