【问题标题】:Why does this AJAX call take so long?为什么这个 AJAX 调用需要这么长时间?
【发布时间】:2012-08-09 06:12:15
【问题描述】:

这通常需要 2-4 秒,这对于它正在做的工作来说似乎太长了。 这是 AJAX:

$("#IngTable").html("<center><img src=../img/loading.gif /></center>");

    var search = document.getElementById("IngSearch").value;
    var apiLink = "/API/Ingredient/Search?search=" + search;
    $.ajaxSetup({ accepts: "application/json" });
    $.ajax({
        url: apiLink,
        type: "GET",
        success: function(data) {
            var ingredients = JSON.parse(data);
            var htmlIngred = "";
            for (var i = 0; i < ingredients.length; i++) {
                htmlIngred += "<tbody><td><span>" + ingredients[i].Name + "</span></td><td><a class='btn btn-success btn-mini' onclick='addIngred(" + ingredients[i].IngredientId + ");'>Add</a></td></tbody>";
            }
            document.getElementById("IngTable").innerHTML = htmlIngred;
        },
        error: function (a, b, c) { }
    });

这里是 Web API 控制器:

    [HttpGet]
    public string IngredientSearch(string search)
    {
        var sw = Stopwatch.StartNew();
        var db = new Glubee.Model.GlubeeEntities();
        var results = db.Ingredients.Where(x => x.Name.Contains(search)).ToArray();
        sw.Stop();
        return JsonConvert.SerializeObject(results);
    }

成分表中只有 16 项内容,每项内容长度不超过 20 个字符。

有没有人知道问题可能出在哪里,导致需要这么长时间?

编辑:如果有帮助,这是我的 Global.asax.cs 页面:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

这是我的 RouteConfig:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

【问题讨论】:

  • 在您的数据库上放置一个分析器并检查您的 Sql 执行情况
  • 成分搜索耗时过长?
  • @benPearce 我在 IngredientSearch 函数的开头和结尾放了一个秒表,它在 30-100 毫秒之间,大部分时间接近 40 毫秒,所以我认为问题不在于功能。
  • @rikitikitik 请参阅上面的评论。谢谢你的帮助。
  • @user1308743 Web API 中的方法名称是成分搜索,而在 ajax 中您正在调用 /API/Ingredient/Search?search 所以这是正确的 Web API 调用

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


【解决方案1】:

您是否准确地确定了什么是缓慢的?

例如;在您的 IngredientSearch 方法中,如果您将代码更改为

[HttpGet]
public string IngredientSearch(string search)
{
    var sw = Stopwatch.StartNew();
    var db = new Glubee.Model.GlubeeEntities();
    var results = db.Ingredients.Where(x => x.Name.Contains(search)).ToArray();
    sw.Stop();
    return JsonConvert.SerializeObject(results);
}

[HttpGet]
public string IngredientSearch(string search)
{
    return String.Empty;
}

还需要很长时间吗?

如果是这样;然后我们必须看看一个脚本库问题;如果不是,那么就是你的数据库层出了问题。

这样的错误通常很难找到,所以你必须忘记假设并一点一点地测试。 上面的改动消除了很多问题,因为很少的努力给了你很大的线索。

PS:对不起,我知道这不是一个答案;但我想将它作为一个发布,以便我可以清楚地突出代码更改;请不要投反对票!

【讨论】:

  • 我意识到上述更改可能会导致您的 Javascript 出现问题,但我们这样做只是为了确定问题的实际出处;由这个引起的 Javascript 错误是一个红鲱鱼。
  • 按照您的建议,我已经能够找到问题所在。序列化到 JSON 和从 JSON 序列化都需要很长时间,因为我不知道,这不仅仅是获取和序列化我想要的“成分”,而是每个表中与之相关的所有内容,包括图片。回顾它是有道理的并解释了我的困惑,我计算了获得结果需要多长时间,而且速度非常快,但是在返回之前对其进行序列化不包括在秒表时间中。感谢您的帮助。
  • 只需将其重写以列出具有我需要的名称和 ID 的对象列表,而其余部分不包含在结果中,感觉几乎是即时的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-04-29
  • 2011-08-27
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多