Код: Выделить всё
[SessionState(SessionStateBehavior.Disabled)]
У меня есть простое действие контроллера, где я вызываю метод 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

Из результата видно, что вызов 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);
}
Код: Выделить всё
$(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 Как сделать контроллер асинхронным?
Есть ли у кого-нибудь обходное решение этой проблемы.
Подробнее здесь: https://stackoverflow.com/questions/323 ... ltaneously
Мобильная версия