我需要生成一个HTML块,供HTTP请求触发的异步操作使用(我调用Facebook API来响应HTTP请求,HTML块作为参数)。我已经有一个生成所需HTML的.aspx页面,并希望重用该代码。
我看到三个选项,我都不想做:
当我需要HTML块时,向本地服务器上的.aspx页面发出HTTP请求。效率低下并不关心我,但设计妥协确实如此。由于应用程序的结构如何,我不得不将我的.aspx代码丢弃:
如果(localRequest)
{doOneThing();}
否则
{doTheOtherThing();}
我不想这样做。
创建一个ASP.NET应用程序主机以吐出这些HTML块。我想这会提高2的效率,但不会提高复杂性。
还有其他选择吗?理想情况是实例化.aspx页面类并使用模拟的HttpRequest或HttpContext执行它。这可以做到,值得麻烦吗?
答案 0 :(得分:3)
这个问题有两个相关但不同的部分:
a)如何确保异步操作具有有效的HttpContext?
b)如何以字符串形式返回ASPX执行的HTML输出?
对于(a),它取决于您如何调用异步操作。不幸的是,在.NET中有quite a few ways to do async operations。但是如果你想将HttpContext传播到异步代码,那么只有一个很好的选择:Event-based Asynchronous Pattern。虽然恕我直言,基于事件的异步模式有一些缺点(例如没有“等待”操作,难以同步多个线程,需要重构代码等),但它与ASP.NET异步页面完全集成非常酷。确保在回调获得控制权时设置正确的上下文。
因此换句话说,如果您正在按照为ASP.NET异步页面设置的规则进行播放,那么传播上下文只能起作用(不需要做很多额外的工作)。如果您不熟悉,请参阅async pages上的文章。这是有用的another post。简而言之,您将页面处理分为三个阶段: 1)设置长时间运行的操作 2)开始长时间运行(例如,获取昂贵的数据) 3)一旦所有长时间运行的操作完成,ASP.NET将调用您的Page_PreRenderComplete处理程序。从这里,您可以绑定数据并呈现HTML。
可能会使这一点变得困难的是,您通常需要重新分配现有代码,因为您需要将数据从绑定数据中分离出来。
现在,在上面的(b)中:一旦你有了上下文,另一个问题是如何将你的页面输出变成一个字符串。有几种方法可以做到这一点,但最简单的方法是将要输出的内容封装到用户控件(.ASCX)中,然后按照此博客文章中的说明进行操作:http://stevesmithblog.com/blog/render-control-as-string/。如果您还需要数据绑定,请参阅this post。