1

我想FFMPEG在服务器端使用长时间运行的过程来转换视频文件。我决定向AJAX服务器发送请求,因此转换过程应该并行运行。但是我的控制器一次只服务一个请求,因为这需要很长时间才能完成任务。我调查了问题,我知道SessionStatemake的控制器执行序列化了。这里更详细地解释了相同的问题。我想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 网络控制台:

在此处输入图像描述

从结果中可以清楚地看出,对控制器的 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如何使控制器异步?
有没有人有解决方法。

4

0 回答 0