【问题标题】:Running Multiple WebRequests at the same time with $.ajax使用 $.ajax 同时运行多个 WebRequest
【发布时间】:2011-11-30 19:32:30
【问题描述】:

我有 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 返回一个进度计数/总数,以便我可以显示数据库刷新的进度条。

运行 UpdateServerData 的 $.ajax 设置为异步工作:true

然后使用 setTimeouts,我每隔几秒运行一次 GetServerUpdateProgress,它会返回 UpdateServerData 距离完成还有多远。

工作应用程序功能:

不工作:

因此,在非工作版本中似乎发生的是,即使 ajax 正在调用该函数,它也没有运行 GetServerUpdateProgress,它实际上并没有开始处理其中的任何内容,直到 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);
        }
    });
}

【问题讨论】:

    标签: c# javascript asp.net-mvc-3 jquery


    【解决方案1】:

    在这里有点摸不着头脑,但如果启用了会话状态,ASP.NET 实际上会将异步请求排队并按顺序处理它们(无疑是为了避免处理同步问题)。

    如果可行,我的建议是一起禁用会话状态,如果这不可行,您可以使用以下属性为每个控制器禁用它:

    [SessionState(SessionStateBehavior.Disabled)]
    public class SomeController
    

    【讨论】:

    • 做到了,丹!谢谢!我花了一段时间才发现你在 Behavior 中有一个额外的 u:P
    • 太棒了 :) 很高兴能帮上忙,那个也让我难过一阵子……对不起,澳大利亚拼写:P。现已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多