【发布时间】: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