Мне приходится иметь дело с приложением WebForms (.Net 4.7), которое загружает предварительно обработанные UserControls на стороне сервера, вызывая HttpHandler с помощью Javascript / Angular со стороны клиента.
HttpHandler предварительно обрабатывает 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());
}
}
Поскольку этот стиль работал очень хорошо несколько лет, я не могу использовать стиль async / await в UserControls, потому что я получаю сообщение об ошибке, что страница должна иметьатрибут Async = true.
UserControls выглядят так:
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);
}
}
Я уже пытался создать простой класс страницы, который программно устанавливает режим Async, и использую его в "MyHandler "HttpHandler, но это тоже не работает.
public class AsyncPage : Page
{
public AsyncPage()
{
this.AsyncMode = true;
}
}
}
Когда я отлаживаю UserControl, свойство Page всегда показывает AsyncMode = false, IsAsync = false.
Так что, я думаю, это вызвано вызовом HttpServerUtility.Execute (), который не может запустить страницу WebForms в асинхронном режиме.
Кто-нибудь знает, как с этим справиться?