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

dia*_*dem 4 .net c# asp.net multithreading

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

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

由于UI可能需要最多30秒才能加载,但结果永远不会改变,我会在项目保存在后台线程中时立即缓存pdf.

我对这种方法的主要关注是,如果我浏览UI,我不得不担心超时.虽然后台线程等可以持续所需的时间,但aspx页面只能持续很长时间才能终止它们.

我有两个想法如何照顾这个.第一个想法是创建一个加载UI的aspx页面,覆盖渲染,并将渲染的数据存储到数据库中.后台线程将在内部对该页面进行WebRequest,然后从数据库中获取结果.这显然必须考虑安全性,如果UI生成时间太长,还需要担心超时.

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

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

Chr*_*s S 6

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

IHttpHandler的

这个问题有完整的答案.一般的jiste是Response.Filter通过实现自己的可读流和自定义来捕获输出IHttpHandler.

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

Web客户端

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

WebClient client = new WebClient();
string result = client.DownloadString("http://localhost/yoursite");
Run Code Online (Sandbox Code Playgroud)

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"));
}
Run Code Online (Sandbox Code Playgroud)