Сеанс не сохраняет TempData через несколько вызовов Ajax к контроллеру - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь работать с объектом (VideoInfo) в нескольких методах Action. Форма отправляет модель представления с видеофайлом в метод Upload в VideoController. Он загружает видео и возвращает сгенерированный гид. Когда обратный вызов вернулся, новый метод ajax сделан к методу Convert, который возвращает guid. Как видно из части javascript файла Create.cshtml, он выполняет два других вызова Ajax: один для метода Progress и один для метода Azure.

При попытке извлечь объект VideoInfo в методе Azure и методе Progress, videoInfo имеет значение null. Хотя он успешно сохраняет данные между методом Upload и методом Convert. Я использую TempData.Peek (), чтобы не пометить его для удаления.

Я вижу, что метод Upload and Convert использует один и тот же экземпляр VideoController, тогда как метод Progress и Azure использует другой экземпляр, я думаю, это может быть связано с проблемой.

InstanceId when running Upload method: 23ef96fa-c746-4722-ad07-e9e40fc95f29<br> InstanceId when running Convert method: 23ef96fa-c746-4722-ad07-e9e40fc95f29<br> InstanceId when running Progress method: 0aba24b2-ccb8-434d-a27d-cc66cb52c466<br> InstanceId when running Azure method: 0aba24b2-ccb8-434d-a27d-cc66cb52c466<br>

Как сохранить данные между вызовами Ajax в VideoController?
Почему идентификатор экземпляра одинаков для первых двух вызовов, но затем он меняется?

VideoController.cs

using System;

namespace MediaPortal.Controllers
{
    [Authorize(Roles = "Admin")]
    public class VideoController : Controller
    {
        private static Guid InstanceId { get; }

        static VideoController()
        {
            InstanceId = Guid.NewGuid();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Upload(CreateVideoViewModel model)
        {
            if (ModelState.IsValid)
            {
                if (model.File != null)
                {
                    Debug.WriteLine("Upload method InstanceId: " + InstanceId.ToString());

                    // ...

                    TempData[videoInfo.Id] = videoInfo;

                    videoInfo.cvvm.File.SaveAs(videoInfo.TempPath);

                    return Json(new { Successfull = true, Id = videoInfo.Id });
                }

                return null;
            }

            return null;
        }

        [HttpPost]
        public ActionResult Convert(string id)
        {
            Debug.WriteLine("Convert method InstanceId: " + InstanceId.ToString());

            // Create new object of FFMpegConvertor
            var converter = new FFMpegConverter();
            VideoInfo videoInfo = (VideoInfo)TempData.Peek(id);

            // ...

            return Json(new { Successfull = true, Id = videoInfo.Id });
        }

        [HttpPost]
        public ActionResult Azure(string id)
        {
            Debug.WriteLine("Azure method InstanceId: " + InstanceId.ToString());

            VideoInfo videoInfo = (VideoInfo)TempData[id];

            // ...

            if (videoUpload != null && thumbnailUpload != null)
            {
                Video video = new Video
                {
                    Id = videoInfo.Id.ToString(),
                    Name = videoInfo.cvvm.Name,
                    ProjectId = videoInfo.cvvm.ProjectId,
                    Type = "mp4",
                    VideoUri = videoUpload.Uri.ToString(),
                    ThumbnailUri = thumbnailUpload.Uri.ToString()
                };

                db.Videos.Add(video);
                db.SaveChanges();

                return Json(new { Successful = true, Data = Url.Action("Index", new { projectId = videoInfo.cvvm.ProjectId }) });
            }

            return null;
        }

        [HttpPost]
        public JsonResult Progress(string id)
        {
            Debug.WriteLine("Progress method InstanceId: " + InstanceId.ToString());

            try
            {
                VideoInfo videoInfo = (VideoInfo)TempData.Peek(id);

                return Json(new { Data = videoInfo.Progress });
            }
            catch
            {
                return Json(new { Data = "No Video Information in Dictionary for Id: " + id });
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
} 

Create.cshtml (JQuery / Ajax)

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
<script src="http://malsup.github.com/jquery.form.js"></script>

<script>
    $.noConflict();
    jQuery(document).ready(function ($) {

        var bar = $('.progress-bar');
        var percent = $('.percent');

        $('#Myform').ajaxForm({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            beforeSend: function () {
                var percentVal = '0%';
                bar.width(percentVal);
                percent.html(percentVal);
            },
            uploadProgress: function (event, position, total, percentComplete) {
                var percentVal = percentComplete + '%';
                bar.width(percentVal);
                percent.html(percentVal);
            },
            complete: function (uploadStatus) {
                console.log("Upload finished for video with Id: " + JSON.parse(uploadStatus.responseText).Id);
                setTimeout(function () { progress(uploadStatus) }, 1000);
                $.ajax({
                    type: "POST",
                    url: '@Url.Action("Convert", "Video")?id=' + JSON.parse(uploadStatus.responseText).Id,
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    complete: function (convertStatus) {
                        console.log("Conversion finished for video with Id: " + JSON.parse(convertStatus.responseText).Id);
                        $.ajax({
                            type: "POST",
                            url: '@Url.Action("Azure", "Video")?id=' + JSON.parse(convertStatus.responseText).Id,
                            dataType: "json",
                            contentType: "application/json; charset=utf-8",
                            complete: function (azureStatus) {
                                window.location.href = JSON.parse(azureStatus.responseText).Data;
                            }
                        });
                    }
                });
            }
        });

        function progress(uploadStatus) {
            $.ajax({
                type: "POST",
                url: '@Url.Action("Progress", "Video")?id=' + JSON.parse(uploadStatus.responseText).Id,
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                complete: function (progressStatus) {
                    console.log("Progress: " + JSON.parse(progressStatus.responseText).Data);
                    if (JSON.parse(progressStatus.responseText).Data < 100) {
                        setTimeout(function () { progress(uploadStatus) }, 1000);
                    }
                    else if (JSON.parse(progressStatus.responseText).Data >= 100) {
                        console.log("Video Conversion Completed");
                    }
                    else {
                        console.log("Something went wrong");
                    }
                }
            })
        }
    });
</script> 

1 Ответ

0 голосов
/ 30 августа 2018

Кажется, проблема была в IIS Express.Хотя я не могу сказать, почему.Я понял это, потому что, когда я развернул проект на своем производственном сервере в Azure, все работало нормально.

Таким образом, вместо того, чтобы использовать IIS Express, я установил IIS на свою машину для разработки, после этого прекрасно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...