ASP .NET Core中间件的异步进度?

时间:2018-11-07 20:33:55

标签: c# asp.net asp.net-core

我有一个带有mvc的web-api,它正在执行一堆启动初始化,这需要几分钟。我希望该URL在此期间以进度指示器响应请求。我的想法是使用中间件来实现以下目标:

public async Task Invoke(HttpContext httpContext)
{
  await httpContext.Response.WriteAsync("Loading...");

  await Task.Delay(5000); // the initialization-stuff (which is not started here but just waited on)

  httpContext.Response.Clear();

  await _next(httpContext); // continue to my MVC-page
}

但是,这似乎不起作用(ERR_INCOMPLETE_CHUNKED_ENCODING)。如何正确清除/重置响应,以便初始化完成后可以编写新的真实响应。


我改用这样的东西(足够好):

public async Task Invoke(HttpContext httpContext)
{
  if (!task.IsCompleted)
    await httpContext.Response.WriteAsync("Loading...");
  else
    await _next(httpContext); // continue...
}

1 个答案:

答案 0 :(得分:1)

一旦将数据发送到客户端,您将无法取回它。您无法替换现有页面,只能添加。

因此,您可以做两件事:

  1. 您将响应延迟到初始化完成(可能不可行)。
  2. 您发送其他内容并结束请求。您可以使用AJAX使要发送的页面轮询服务器,以查看初始化是否已完成。然后,页面可以重新加载自身。

创建一个新的API终结点,以回复初始化状态。使页面每隔几秒钟轮询一次该端点。