Контроллер не может обслуживать запросы одновременноC#

Место общения программистов C#
Ответить
Anonymous
 Контроллер не может обслуживать запросы одновременно

Сообщение Anonymous »

Я хочу конвертировать видеофайл с помощью FFMPEG на стороне сервера, это длительный процесс. Я решил отправить запрос AJAX на сервер, чтобы процесс преобразования выполнялся параллельно. Но мой контроллер обслуживает один запрос за раз, поэтому выполнение задачи занимает много времени. Я исследовал проблему и узнал, что выполнение контроллера SessionState make сериализовано. Здесь описана та же проблема более подробно. Я хочу отключить поведение SessionState в MVC 2.

Код: Выделить всё

[SessionState(SessionStateBehavior.Disabled)]
Это добавлено в MVC 3+. Как добиться того же с MVC 2
У меня есть простое действие контроллера, где я вызываю метод 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 Как сделать контроллер асинхронным?

Есть ли у кого-нибудь обходное решение этой проблемы.

Подробнее здесь: https://stackoverflow.com/questions/323 ... ltaneously
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»