我必须通过从客户端调用 Javascript/Angular 的 HttpHandler 来处理加载服务器端预呈现用户控件的 WebForms (.Net 4.7) 应用程序。
HttpHandler 通过这个旧的“hack”预渲染 UserControls
public class MyHandler : IHttpHandler
{
public override void ProcessRequest(HttpContext context)
{
var page = new Page();
var control = page.LoadControl("~/MyFancyUC.ascx");
var form = new HtmlForm { ID = "Form1" };
form.Controls.Add(control);
page.Controls.Add(form);
var stringBuilder = new StringBuilder();
using (StringWriter output = new StringWriter(stringBuilder))
{
HttpContext.Current.Server.Execute(page, output, false);
}
context.Response.Write(stringBuilder.ToString());
}
}
由于这种风格几年来运行良好,我不能在 UserControls 中使用 async/await 风格,因为我遇到了一个错误,即页面需要具有 Async=true 属性。
用户控件如下所示:
public partial class MyFancyUC: UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
Page.RegisterAsyncTask(new PageAsyncTask(HandleAsync));
}
private async Task HandleAsync()
{
var data = await GetDataAsync();
BindData(data);
}
}
我已经尝试创建一个简单的页面类,它以编程方式设置异步模式,并在“MyHandler”HttpHandler 中使用它,但这也不起作用。
public class AsyncPage : Page
{
public AsyncPage()
{
this.AsyncMode = true;
}
}
}
当我调试 UserControl 时,Page 属性总是显示 AsyncMode=false,IsAsync = false。
所以我猜,这是由 HttpServerUtility.Execute() 调用引起的,它不能在异步模式下运行 WebForms 页面。
有谁知道如何处理这个?
胡子哥哥
哔哔one
相关分类