Серверный метод не выполняет запись в базу данных, если вызывающий абонент на стороне клиента не приостановлен / не прерван (через предупреждение) - PullRequest
0 голосов
/ 06 мая 2020

Я использую метод Ajax post для передачи строки JSON в действие MVC на стороне сервера. Метод IActionResult преобразует строку JSON в строку array, которая загружается на SQL Сервер с помощью методов Microsoft.Data.SqlClient. IActionResult возвращает результат Ok() вызывающему по завершении.

Я заметил аномалию, заключающуюся в том, что загрузка базы данных (на стороне сервера) завершается, только если я приостанавливаю / прерываю браузер, помещая alert сразу после метода Ajax (на стороне клиента). Мой код выглядит следующим образом:

На стороне клиента:

function ExportJSON() {
    var myJson = "some JSON stuff goes here";
    $.ajax({
        type: "POST",
        url: "/Dailies/UploadJson/",
        dataType: 'json',
        data: { jsonString: myJson },
            success: function (data) {
                console.log(data);
            }
    });
    alert("Your data has been saved.");
}

Действие на стороне сервера:

[HttpPost]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<IActionResult> UploadJson(string jsonString)
{
    if (jsonString != null) {
        var myJArray = JsonConvert.DeserializeObject<JArray>(jsonString);
        TimePunches[] timePunches = myJArray.ToObject<TimePunches[]>();

        try 
        {
            string constr = _configuration.GetConnectionString("MYSQLSERVER");
            using (SqlConnection sqlConnection = new SqlConnection(constr)) {
                await sqlConnection.OpenAsync();
                foreach (TimePunches timePunch in timePunches) {
                    string query = "INSERT INTO TimePunches([Projectid], [CrewLeaderId]) ";
                    query += "VALUES(@Projectid, @CrewLeaderId) ";
                    using (SqlCommand cmd = new SqlCommand(query)) {
                        cmd.Connection = sqlConnection;
                        cmd.Parameters.AddWithValue("@Projectid", timePunch.Projectid);
                        cmd.Parameters.AddWithValue("@CrewLeaderId", timePunch.CrewLeaderId);
                        await cmd.ExecuteNonQueryAsync();
                    }
                }
                sqlConnection.Close();
            }
        }
        catch (Exception ex) {
            TempData["msg"] = ex.Message;
        }
    }
    return Ok();
}

Повторяю, действие на стороне сервера загружает данные в база данных (как и ожидалось), пока alert присутствует в клиентском методе ExportJSON(). И наоборот, удаление alert приводит к сбою загрузки базы данных.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 08 мая 2020

Я нашел ответ на этот вопрос. По следующей ссылке представлена ​​отличная статья, объясняющая нюансы асинхронных вызовов JavaScript и, в частности, как управлять проблемами синхронизации при использовании Ajax: https://stackify.com/return-ajax-response-asynchronous-javascript-call/

В моем конкретном В этом случае решение было столь же простым, как добавление квалификатора async: false к моему методу Ajax "post".

...