Как предварительно обработать UserControl с помощью async / await на стороне сервера для ASP.net WebForms - PullRequest
0 голосов
/ 19 декабря 2018

Мне приходится иметь дело с приложением 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 в асинхронном режиме.

Кто-нибудь знает, как с этим справиться?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы должны использовать IHttpAsyncHandler

0 голосов
/ 19 декабря 2018

Асинхронный обработчик HTTP должен реализовывать IHttpAsyncHandler Интерфейс .

Асинхронный Page должен иметь свойство AsyncMode установить на true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...