Using .aspx pages as an HTML template outside of an ASP.NET 3.5 HTTP request
我需要生成一个HTML块,以供HTTP请求触发的异步操作使用(我调用Facebook API响应HTTP请求,将HTML块作为参数)。我已经有了一个生成所需HTML的.aspx页面,并希望重用该代码。
我看到三个选项,我都不想做:
当我需要HTML块时,向本地服务器上的.aspx页发出HTTP请求。这一点的低效与我无关,但设计折衷与之有关。由于应用程序的结构,我必须将.aspx代码丢弃在:
if(本地请求){DoNethIn();}其他的DotheOtherThing();
我不想这么做。
创建一个ASP.NET应用程序主机来输出这些HTML块。我想这会提高2的效率,但不会提高复杂性。
还有其他选择吗?理想情况是实例化.aspx页类,并使用模拟的httpRequest或httpContext执行它。这能做到吗?值得麻烦吗?
这个问题有两个相关但不同的部分:
a)如何确保异步操作具有有效的httpcontext?
b)如何获得作为字符串返回的ASPX执行的HTML输出?
对于(a),这取决于您如何调用异步操作。不幸的是,在.NET中,有很多方法可以执行异步操作。但是,如果您想将httpcontext传播到异步代码,那么只有一个好的选择:基于事件的异步模式。尽管imho基于事件的异步模式有一些缺点(例如,没有"等待"操作、难以同步多个线程、需要重构代码等),但它确实很酷,可以与ASP.NET异步页完全集成,并确保在回调得到控制时设置正确的上下文。
所以换句话说,如果您按照为ASP.NET异步页设置的规则进行操作,那么传播上下文只起作用(不需要做很多额外的工作,也就是说)。如果您不熟悉的话,这里有一篇关于异步页面的文章。这是另一个有用的帖子。简而言之,您将页面处理分为三个阶段:1)长期运行的设置2)启动长时间运行操作(例如获取昂贵的数据)3)一旦所有长时间运行的操作完成,ASP.NET将调用您的页面预呈现完成处理程序。从这里,您可以绑定数据并呈现HTML。
这很难做到的是,由于需要将获取数据与绑定数据分离,因此通常需要重新考虑现有代码。
现在,关于上面的(b):一旦您有了上下文,另一个问题是如何将页面输出变成字符串。也有几种方法可以做到这一点,但最简单的方法可能是将要输出的内容封装到用户控件(.ascx)中,然后按照以下日志中的说明操作:http://stevesmithblog.com/blog/render control as string/。如果您也需要数据绑定,请参阅本文。