Запуск нескольких веб-запросов одновременно с $ .ajax - PullRequest
3 голосов
/ 04 октября 2011

У меня есть 2 приложения MVC, которые необходимо подключить к третьему приложению.Код, вызывающий проблемы, идентичен в обоих приложениях MVC.

    public bool UpdateServerData()
    {
            //string BASE_URL = "http://";
            string BASE_URL = "http://localhost:55094";
            string url = BASE_URL + "/Home/PullLiveData";
            WebRequest wr = WebRequest.Create(url);
            wr.Credentials = CredentialCache.DefaultNetworkCredentials; // uses current windows user
            var response = (HttpWebResponse)wr.GetResponse();
            return true;
    }

    public ActionResult GetServerUpdateProgress()
    {
            //string BASE_URL = "http://";
            string BASE_URL = "http://localhost:55094";
            string url = BASE_URL + "/Home/UpdateProgress";
            WebRequest wr = WebRequest.Create(url);
            wr.Credentials = CredentialCache.DefaultNetworkCredentials; // uses current windows user

            var myobj = new UpdateAJAXProgress();
            var response = (HttpWebResponse)wr.GetResponse();
            var reader = new StreamReader(response.GetResponseStream());
            JavaScriptSerializer js = new JavaScriptSerializer();
            var objText = reader.ReadToEnd();
            myobj = (UpdateAJAXProgress)js.Deserialize(objText, typeof(UpdateAJAXProgress));
            return Json(myobj);
        }

UpdateServerData сообщает localhost: 55094 обновить данные в БД.GetServerUpdateProgress возвращает счетчик результатов / общее количество, чтобы я мог отобразить индикатор выполнения для обновления базы данных.

$ .ajax, который запускает UpdateServerData, настроен на работу async: true

Затем с помощью setTimeoutsЯ запускаю GetServerUpdateProgress каждые несколько секунд, который показывает, насколько далеко UpdateServerData от завершения.

Функциональность рабочего приложения: enter image description here

Не работает:

enter image description here

Так что, по-видимому, в нерабочей версии происходит то, что она не запускает GetServerUpdateProgress, даже если ajax вызывает функцию, она фактически не начинает обрабатывать что-либо внутри нее до тех пор, пока UpdateServerData не будет завершен.Вы можете видеть, что синхронизация ajax установлена ​​правильно, потому что анимация загрузки отображается для обоих на нерабочем снимке экрана.Я ставлю точку останова в начале GetServerUpdateProgress, и она даже не срабатывает, пока не закончится обработка UpdateServerData.

Моя главная проблема заключается в том, что некоторые настройки, возможно, в webconfig или global.asax, отличаются и чтоэто то, что заставляет оба этих приложения работать немного по-разному.Любые идеи?

Вот некоторые из связанных JavaScript:

function UpdateData()
{
        $("#ChartUpdateProgressWhole").show();

    $.ajax({
        type: "POST",
        async: true,
        url: '@(Url.Action("UpdateServerData", "Charts"))',
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            Alert2({
                iconfilename: "tick.png",
                text: "Database Updated!",
                autohide: true,
            });
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {

        },
        complete:function (jqXHR, textStatus) {
            $("#ChartUpdateProgressWhole").hide();
            timerStop = true;
            LoadChart();
        },
    });

    if (!timerStop) {
        CheckProgress();
        }
}
function CheckProgress()
{
    if(timerStop) {
        CheckProgressAjax();
        return;
    }
    window.setTimeout(CheckProgress, 2000);
    CheckProgressAjax();
}

function CheckProgressAjax()
{
    $.ajax({
        type: "POST",
        async: false,
        url: '@(Url.Action("GetServerUpdateProgress", "Charts"))',
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            var width = (data.Completed * 100)/data.Total;
            $("#ChartUpdateProgressPercent").css("width", width);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(XMLHttpRequest.status);
            alert(XMLHttpRequest.responseText);
        }
    });
}

1 Ответ

3 голосов
/ 06 октября 2011

Здесь мы немного потемнеем, но ASP.NET фактически ставит в очередь асинхронные запросы и обрабатывает их по порядку, если включено состояние сеанса (без сомнения, чтобы избежать проблем с синхронизацией).

Я бы предложил отключить состояние сеанса все вместе, если это возможно, если это невозможно, вы можете отключить его для каждого контроллера, используя следующий атрибут:

[SessionState(SessionStateBehavior.Disabled)]
public class SomeController
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...