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