Asp.net mvc Web API-在长时间导入过程中保持连接打开

Asp.net mvc Web API-在长时间导入过程中保持连接打开,asp.net-mvc,asp.net-web-api,signalr,Asp.net Mvc,Asp.net Web Api,Signalr,我们有一个MVC5 SPA应用程序,其中一个Web API控制器需要处理文件的导入。这个过程每月进行一次,最多需要5个小时(我们的客户希望通过Web API进行导入) 我们的问题是,连接在一小时后丢失(ERR_connection_RESET),我们需要在整个过程中保持连接打开 我们认为一种选择是从服务器发送部分内容,让浏览器知道连接仍然处于活动状态并正在处理中。在MVC控制器中,类似以下内容: public class PartialActionResult : ActionResult {

我们有一个MVC5 SPA应用程序,其中一个Web API控制器需要处理文件的导入。这个过程每月进行一次,最多需要5个小时(我们的客户希望通过Web API进行导入)

我们的问题是,连接在一小时后丢失(ERR_connection_RESET),我们需要在整个过程中保持连接打开

我们认为一种选择是从服务器发送部分内容,让浏览器知道连接仍然处于活动状态并正在处理中。在MVC控制器中,类似以下内容:

public class PartialActionResult : ActionResult
{
    private Counter _counter;
    private Action<Counter> _counterIncrease;

    public PartialActionResult(Action<Counter> counterIncrease)
    {
        _counter = new Counter();
        _counterIncrease = counterIncrease;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ContentType = "text/html";
        context.HttpContext.Response.BufferOutput = true;
        if (context.HttpContext.Response.IsClientConnected)
        {
            while (_counter.Value < 100)
            {
                _counterIncrease(_counter);
                context.HttpContext.Response.Write("processing...");
                if (_counter.Value == 100)
                    context.HttpContext.Response.Write("OK");
                context.HttpContext.Response.Flush();
            }
        }
    }
}
公共类PartialActionResult:ActionResult
{
私人柜台;;
私人行动——反增长;
公共部分行动结果(行动抵消)
{
_计数器=新计数器();
_反增长=反增长;
}
公共覆盖无效ExecuteSult(ControllerContext上下文)
{
context.HttpContext.Response.ContentType=“text/html”;
context.HttpContext.Response.BufferOutput=true;
if(context.HttpContext.Response.IsClientConnected)
{
而(_计数器值<100)
{
_反增量(_计数器);
context.HttpContext.Response.Write(“处理…”);
如果(_counter.Value==100)
context.HttpContext.Response.Write(“OK”);
context.HttpContext.Response.Flush();
}
}
}
}
有了它,我们可以传递一个委托作为引用,从那里我们可以更新导入状态的信息

Web API是否有任何选项,因为此ActionResult仅适用于MVC控制器?除此之外,是否有保持连接打开的选项?顺便说一句,我们不能使用信号器,以防万一


提前感谢

如果您不能使用SignalR,那么您注定要使用足够长的超时时间,或者切换到轮询。没有别的办法。请注意,像您这样调用
Thread.Sleep
显然是一种错误的做法。是文件上传花费了这么长时间,还是仅仅是处理过程?如果只是处理,将作业交给单独的后台线程(可能在Windows服务中),并在必要时以某种方式通知用户,例如通过电子邮件,或提供一个API端点,以便他们可以定期检查作业进度。SignalR绝对是@LexLi指出的方法,另一种不太推荐的方法是使用nugget的
webbackgroundworker
,让后台线程处理任务并通知web api。检查一次。@ADyson问题正在处理中。用户的请求是使用这种方法(我们有几个导入。所有导入都以相同的方式进行。尽管存在此问题,客户端不希望破坏设计的一致性)@LexLi我在示例中的错误(已编辑)。以投票为例。你知道通过询问承诺是否会保持连接打开吗?不幸的是,我们不能使用信号机。。。生产中的应用程序在负载平衡器下,到目前为止,用户不希望为Signal安装背板。