为什么我的AJAX只能从我的站点服务器调用数据库服务器?

时间:2014-03-14 17:02:40

标签: sql-server ajax iis intranet

我希望这是发布此内容的正确网站。我不确定我是否应该发布这里或服务器故障,但看到这涉及到网站的观点,我想也许这个社区可能会更准确一点,但我不是100%就此。< / p>

我一直在撞墙超过半年,试图弄清楚这里发生了什么。如果我能通过我们的Site Server来追踪AJAX调用的速度很慢,我会欣喜若狂。

我为我所工作的组织构建了一个小型网络应用程序,它几乎就像这样设置:

enter image description here

站点本身(WebMatrix IIS Express站点)驻留在站点服务器上,但(在C#的帮助下)它使用SQL查询来查询数据库服务器上的(相当大的)数据库。

问题是,当我的网站执行需要它查询数据库的AJAX(简单的jQuery $.ajax()调用)时,响应需要5秒钟,每个!

(Chrome网络详细信息): enter image description here

(您会看到某些回复非常快。这些回复中包含的数据不会比其他回复少得多。也许在某个地方造成网站的数据限制服务器来分析它们吗?)

现在这里是踢球者:

在开发计算机上,开发站点的本地计算机,切断Site Server,具有相同的代码,并查询同一个数据库,但 lag 不会持续存在在这种情况下。这种情况下的响应是低毫秒,正如我所期望的那样。

以下是Chrome网络详细信息从开发计算机中看到的内容:

enter image description here (甚至没有接近1秒,更不用说5)。

更具体细节

  • 直接从Site Server启动此站点时,滞后仍然存在。
  • WebMatrix使用SQL Server CE,而数据库服务器上的SQL安装是SQL Server 2005(我真的不认为这有所不同,因为查询本身并不特别,加上它&# 39;与任一场景中使用的代码相同。)
  • Site Server已经过测试,看看RAM,处理器和带宽是否最大化,但事实是运行此Web应用程序甚至无法触及Site Server的资源。数据库服务器也是如此。
  • 与数据库的连接是只读的(怀疑这很重要,只是尽量提供尽可能详细的信息)。
  • 我们已经在数据库服务器上索引了数据库,但它几乎没有帮助。
  • 即使它只是一个Intranet站点,但我被告知将站点直接放在数据库服务器上是不可取的。
  • 目前,AJAX请求不是异步的,但它仍然不需要这么长时间(特别是考虑到它只落后于Site Server而不是开发机器,即使代码在两者中都是100%相同例)。
  • 可能没有任何区别,但我在使用WebMatrix和C#环境的ASP.NET WebPages中。
  • 站点服务器上的操作系统是:Windows Server 2008 R2
  • 数据库服务器上的操作系统是:Windows Server 2003

什么可以使这个应用程序在本地计算机上运行良好,但不能从Site Server运行?我认为问题必须是Site Server,考虑到这一点,但它的资源都没有最大化或任何东西。如果返回的数据超过一定数量(这个数量看起来很低,老实说),似乎每个请求只会滞后约5秒。

事实是,我绝望地被困在这里。我们在过去的几个月里尝试了所有的东西(我们在另一个内部网站点遇到了类似的问题,其中AJAX调用也滞后于那里,我们刚刚使用它一段时间了。)

我不知道还有什么可以查看。

如果有人想看一些代码

jQuery(其中一个AJAX请求,它们都是用不同参数重复的)

$.ajax({
    url: '/AJAX Pages/Get_Transactions?dep=1004',
    async: false,
    type: 'GET',
    dataType: "json",
    contentType: "application/json",
    success: function (trans) {
        for (var i = 0; i < trans.length; i++) {
            trans[i][0] = getTimeStamp(trans[i][0]);
        }
        jsonObj1004 = trans;
    },
    error: function (jqXHR, textStatus, error) {
        alert("Oops! It appears there has been an AJAX error. The Transaction chart may not work properly. Please try again, by reloading the page.\n\nError Status: " + textStatus + "\nError: " + error);
    }
});

C#服务器端代码(使用Razor)

@{
    Layout = "";

    if (IsAjax)
    {
        var db = Database.Open("OkmulgeeCIC");
        Dictionary<string, double> dataList = new Dictionary<string, double>();
        var date = "";
        var previousDate = "";
        double amount = 0;
        string jsonString = "[";
        string queryDep = "SELECT ba_trans_entered AS transDate, (ba_trans_amount * -1) AS transAmount FROM BA_VTRANS WHERE ba_trans_year >= 2011 AND ba_trans_operator = 'E' AND ba_trans_system = 'AP' AND ba_trans_ledger LIKE @0 + '%' ORDER BY ba_trans_entered ASC";
        string dep = Request.QueryString["dep"];

        foreach (var row in db.Query(queryDep, dep))
        {
            date = row.transDate.ToString();
            date = date.Substring(0, date.IndexOf(" "));
            amount = Convert.ToDouble(row.transAmount);

            if (date == previousDate)
            {
                dataList[date] = dataList[date] + amount;
            }
            else
            {
                dataList.Add(date, amount);
            }

            previousDate = date;
        }

        foreach (var item in dataList)
        {
            jsonString += "[";
            jsonString += Json.Encode(item.Key) + ", ";
            jsonString += Json.Encode(item.Value) + "],";
        }

        //jsonString += Json.Encode(date);
        jsonString = jsonString.TrimEnd(',');
        jsonString += "]";
@Html.Raw(jsonString)
    }
    else
    {
        Context.RedirectLocal("~/");
    }
}

来自SQL SERVER PROFILER的ADDITONAL信息

来自开发机器 enter image description here

来自用户计算机(延迟) enter image description here

5 个答案:

答案 0 :(得分:1)

只是查看你的代码,我跳出了两件事

1)您没有关闭数据库连接,这非常糟糕。将您的连接对象包装在使用块中(首选)或在数据工作结束时添加对.Close()的调用

using(var db = Database.Open())
{
     //do work
}

2)在这样的循环中进行字符串连接是一件非常糟糕的事情。使用StringBuilder。或者,因为您无论如何都要输出JSON,只需将对象捆绑到列表或其他内容中,然后将其传递给JSON.Encode()(首选)

答案 1 :(得分:0)

在我看来,这个问题来自你的Site Server,但无论如何你可以试试这个: 1 /将您的站点发布到任何Internet Web服务器。如果它仍然很慢=&gt;你的代码问题 - &gt;检查你的代码。 如果没有转到2 /检查您的配置站点服务器和数据库服务器。它可能是防火墙或TCP / IP:两个服务器之间的端口或NETBIOS /域名。

答案 2 :(得分:0)

我不知道这是否与此问题有任何关联,因为我无法看到您如何调用您的应用程序。但是当我使用域名调用其他服务器时,我有多次使用C#在IIS上经历了大约5秒的延迟(这也可以是localhost)。而应该使用ip。

如果您尝试使用IP而不是使用域

来玩这个可能会很好

答案 3 :(得分:0)

在使用AjAX和JSF网站时,我有类似的东西。

Jquery loading taking excessive time

由于您已经在开发机器上使用它,因此在您的情况下可能不是问题。 但是要排除任何这样的场景,你可以在不使用jquery的情况下开发页面吗?

答案 4 :(得分:0)

我有一个类似的问题,我会使用for循环调用20个sprocs,它们不是大的sprocs介意你,而是一个将返回5个值的sproc。

它可以正常工作但是时不时会出现延迟,并且无法加载任何一个或很少的数量,直到完全超时。

那时我发现了SQL Server的参数嗅探。

要修复它,我在sproc参数中添加了等于来自我的C#代码的传入参数。

旧代码:

CREATE PROC [dbo].[sp_procname_proc]
(
   @param1 int,
   @param2 int,
   @param3 varchar(5),
   --..... etc .....
)AS
BEGIN
  -- select from db
END

新代码

CREATE PROC [dbo].[sp_procname_proc]
(
   @param1 int,
   @param2 int,
   @param3 varchar(5),
   --..... etc .....
)AS
BEGIN
  @localParam1 INT = @param1
  @localParam2 INT = @param2
  @localParam3 varchar(5) = @param3
  -- select from db using new parameters
END