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的最佳方法是什么?
我知道3种可能的解决方案:
这个问题有完整的答案.一般的jiste是Response.Filter通过实现自己的可读流和自定义来捕获输出IHttpHandler.
这不允许您远程捕获页面的输出,但是它只允许您捕获将事先发送到客户端的HTML,并且必须调用该页面.因此,如果您使用单独的页面生成PDF,则必须调用它.
我可以通过ASP.NET看到的唯一替代方法是使用阻塞WebClient来请求生成HTML的页面.获取该输出,然后将其转换为PDF.在您完成所有这些操作之前,您显然可以检查缓存以查看它是否已存在.
WebClient client = new WebClient();
string result = client.DownloadString("http://localhost/yoursite");
Run Code Online (Sandbox Code Playgroud)
另一个可能的解决方案是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)