如何在服务器端为 ASP.net WebForms 预渲染带有异步/等待的 UserControl

我必须通过从客户端调用 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 页面。


有谁知道如何处理这个?


翻过高山走不出你
浏览 140回答 2
2回答

胡子哥哥

异步 HTTP 处理程序必须实现IHttpAsyncHandlerInterface。异步Page必须将其AsyncMode属性设置为true。

哔哔one

你必须使用 IHttpAsyncHandler
打开App,查看更多内容
随时随地看视频慕课网APP