Уведомить представление после asyn c Задача завершена в MVC - PullRequest
1 голос
/ 14 апреля 2020

У меня есть представление, и я отправляю данные через ajax для действия в MVC. Я хочу получать уведомления в представлении только тогда, когда задача выполнена. Проблема, с которой я сталкиваюсь, заключается в том, получаю ли я уведомление до этого или я жду, пока задача не будет выполнена, мой вид заблокирован. Вот пример того, что я делаю:

function UploadFile(file) {
    $.ajax({
        url: '/Home/Upload',
        type: 'POST',
        data: file,
        success: function (result) {
            alert(result);

        }
    });
}


[HttpPost]
public async Task<ActionResult> Upload(httpPostedFileBase file)
{
        NewFile service = new NewFile((long)Session["UserId"]);

        Thread thread = new Thread(() =>service.UploadFile(file));
        thread.Start();
        return Json("File Uploaded", JsonRequestBehavior.AllowGet);
}


    public async Task<string> UploadFile(HttpPostedFileBase file) // returns the file Id in Google Drive
    {
        Google.Apis.Drive.v3.Data.File uploadedFile = new Google.Apis.Drive.v3.Data.File();
        try
        {
            if (file != null && file.ContentLength > 0)
            {
                // Check for credentials
                Google.Apis.Drive.v3.DriveService service = Service;
                // Uploads the file to the server in "~/GoogleDriveFiles" folder.
                /*string path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),*/ // TODO Doesn't work with Unit testing. Must be written manual for testing
                //Path.GetFileName(file.FileName));
                //file.SaveAs(path);
                // Save the metadata of the file
                var FileMetaData = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = Path.GetFileName(file.FileName),
                    MimeType = MimeMapping.GetMimeMapping(file.FileName),
                    Parents = new List<string>
                    {
                       GetReposFolderId()
                    }
                };
                // Create a request for upload
                Google.Apis.Drive.v3.FilesResource.CreateMediaUpload request;
                file.InputStream.Close();
                // Create a stream using the file filepath and filling the request. Then upload.
                using (var stream = new System.IO.FileStream(file.FileName, System.IO.FileMode.Open))
                {
                    request = service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
                    request.Fields = "id";
                    await request.UploadAsync();//TODO Tuka bavi i ne mozesh da browswash prez papkite dokato ne go kachi na servara
                }
                uploadedFile = request.ResponseBody;
            }
        }
        catch (Exception ex)
        {
            ErrorEngine.RuntimeExceptions runtimeExceptions = new ErrorEngine.RuntimeExceptions();
            runtimeExceptions.ManageException(ex, this);
            return ex.ToString();
        }
        return uploadedFile.Id;
    }

Я не очень опытен с MVC и кодированием в целом, как вы могли подумать. Можете ли вы помочь мне с этим, пожалуйста?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

короткий ответ: вы не можете ....

если вы не хотите ждать обработки ... тогда он никогда не узнает ...

UNLESS

либо вы используете опросчик и спрашиваете каждый раз x, либо используете двустороннюю связь ... что довольно сложно, но вы можете посмотреть на SingalR , тогда вы можете отправить сообщение, и все прослушивающие могут получить.

так что проще всего ... для вас ... загрузить файл одним запросом и заставить его ждать ответ.

Загрузка и действие относительно того, что делать, могут быть разделены, это то, что делают многие сайты .. вы можете использовать js, чтобы иметь индикатор выполнения для определения того, как далеко он загружает файл к серверу .. но обрабатывая сервер, если вы не подождете, не будет никакого другого способа, кроме того, что я сказал выше, или вариантов там.

варианты: poller или socket base tech или просто подождите для загрузки и обработки.

Загрузка и обработка могут быть отдельными вызовами с разным откликом, и это то, что делают большинство сайтов ...

0 голосов
/ 14 апреля 2020

Попробуйте это:

[HttpPost]
public async Task<JsonResult> Upload(httpPostedFileBase file)
{
    try {
        NewFile service = new NewFile((long)Session["UserId"]);
        await Task.Run(() => service.UploadFile(file));
    } catch (Exception e) {
        Console.WriteLine(e);
    }

    return Json("File Uploaded", JsonRequestBehavior.AllowGet);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...