【问题标题】:Async progress in ASP .NET Core middleware?ASP .NET Core 中间件中的异步进度?
【发布时间】:2018-11-07 20:33:55
【问题描述】:

我有一个带有 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...
}

【问题讨论】:

  • 你有没有想过将你的“任务”分成不同的动作并使用 ajax 来异步调用它们?然后你可以在前端知道你走了多远。
  • 我建议你看看 SignalR 来处理订阅者的更新:asp.net/signalr
  • 不想让这件事复杂化。该页面非常简单,我想保持这种方式。
  • 您无法“清除”已发送的响应。一个简单的解决方案是首先提供一个“加载”页面,然后使用来自 JS 的单个请求从那里开始艰苦的工作。
  • @AndreasZita 你不能不让这个复杂化——这不是 HTTP 的工作方式。一个客户请求,一个响应。您不能“重置”响应并开始“新”响应。任何从服务器向客户端发送消息的东西都使用复杂的技术,如长轮询或 Web 套接字。所有这些技术都需要明确的客户端编码才能工作。 SignalR 使这更容易,而不是更难。

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


【解决方案1】:

一旦您向客户端发送了数据,您就无法将其收回。您不能替换现有页面,只能追加。

因此,您可以做两件事:

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

创建一个回复初始化状态的新 API 端点。每隔几秒让页面页面轮询该端点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多