控制器无法同时处理请求

时间:2015-09-01 15:22:22

标签: c# session model-view-controller asp.net-mvc-2 session-less

我想在服务器端使用FFMPEG转换视频文件,这是一个长时间运行的过程。我决定向服务器发送AJAX请求,因此转换过程应该并行运行。但是我的控制器一次只能处理单个请求,因为这需要很长时间才能完成任务。我调查了问题,然后我才知道SessionState make的控制器执行是序列化的。 Here更详细地解释了同一问题。我想在SessionState中禁用MVC 2行为。

[SessionState(SessionStateBehavior.Disabled)] 

这已添加到MVC 3+中。如何与MVC 2

实现相同的目标

我有简单的Controller Action,我在调用CovertFile方法,使用FFMPEG转换文件,下面是参考代码

    [HttpPost]
    public ActionResult PostRecordedAudioVideoTemp()
    { 
         string outFile = ConvertFile(audioFileName, videoFileName, output, logFileConversion);
         return Json(new { fileName = Request.Form[0], uploaded = true, type = fileType });
    }

更新:

要确认控制器是否真的已经序列化,我会进行以下测试:

    AudioVideoController
    {    
      public ActionResult Ajax()
        {
            var startTime = DateTime.Now;
            Thread.Sleep(_random.Next(5000, 10000));
            return Json(new
            {
                conttroller = "AudioVideo",
                startTime = startTime.ToString("HH:mm:ss fff"),
                endTime = DateTime.Now.ToString("HH:mm:ss fff")
            }, JsonRequestBehavior.AllowGet);
        }
    }

在视图中:

$(function () {
    for (var i = 0; i < 6; i++) {
        $.getJSON('/AudioVideo/ajax', function (result) {
            console.log(
                result.startTime + ' | ' + result.endTime + '|'+ result.conttroller
            )
        });
    }
});

结果:

14:14:44 562 | 14:14:51 978|AudioVideo
14:14:52 313 | 14:14:57 821|AudioVideo
14:14:57 897 | 14:15:04 580|AudioVideo
14:15:04 995 | 14:15:13 486|AudioVideo
14:15:13 607 | 14:15:21 692|AudioVideo
14:15:21 718 | 14:15:28 459|AudioVideo

Chrome网络控制台:

enter image description here

从结果可以看出,对控制器的ajax调用是阻塞的。除非先前的ajax请求未完成,否则请求无法启动,因此控制器被序列化并一次提供一个请求。

更新2:
我想用同样的方法创建两个独立的控制器并同时向一个控制器发送ajax请求以检查它们是否并行执行

 AudioVideo1Controller 
 public ActionResult Ajax()
    {
        HttpContext.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);

        var startTime = DateTime.Now;
        Thread.Sleep(_random.Next(5000, 10000));
        return Json(new
        {
            conttroller = "AudioVideo1",
            startTime = startTime.ToString("HH:mm:ss fff"),
            endTime = DateTime.Now.ToString("HH:mm:ss fff")
        }, JsonRequestBehavior.AllowGet);
    }

JavaScript:

 $(function () {
        for (var i = 0; i < 6; i++) {
            $.getJSON('/AudioVideo/ajax', function (result) {
                console.log(
                    result.startTime + ' | ' + result.endTime + '|'+ result.conttroller
                )
            });
        }
    });

$(function () {
        for (var i = 0; i < 6; i++) {
            $.getJSON('/AudioVideo1/ajax', function (result) {
                console.log(
                    result.startTime + ' | ' + result.endTime + '|'+ result.conttroller
                )
            });
        }
    });

结果:

 14:33:37 355 | 14:33:46 642|AudioVideo
 14:33:46 649 | 14:33:53 782|AudioVideo1
 14:33:53 790 | 14:34:00 574|AudioVideo1
 14:34:00 580 | 14:34:06 147|AudioVideo1
 14:34:06 151 | 14:34:12 124|AudioVideo1
 14:34:12 127 | 14:34:20 766|AudioVideo1
 14:34:20 770 | 14:34:29 589|AudioVideo1
 14:34:29 792 | 14:34:39 112|AudioVideo
 14:34:39 419 | 14:34:44 942|AudioVideo
 14:34:45 003 | 14:34:54 171|AudioVideo
 14:34:54 643 | 14:35:03 013|AudioVideo
 14:35:03 255 | 14:35:12 062|AudioVideo

结果令人震惊。即使是两个不同的控制器也无法同时服务。

我正在使用.NET MVC 2如何让控制器异步? 有没有人有解决方法。

0 个答案:

没有答案