慢速Web服务回调

时间:2017-10-25 00:14:40

标签: javascript asp.net vb.net web-services

enter image description here问题是关于加快ASP.NET Web应用程序的加载,我发现Web应用程序的过滤功能的加载时间是不可接受的。筛选器列表是从数据库生成的。请参阅以下代码:

此函数位于.js中,并且正在调用webservice方法。

function filterSetup() {
    filterChanged = true;
    var reset = true;
    DDL_WebService.fillFilter(SucceededCallbackWithContext, FailedCallback,new ddlContext("My_Filter", reset));
    filterSystemSetup();   
}

此函数也在.js中,并在webservice方法之后执行。

function SucceededCallbackWithContext(result, userContext) {
    var ddl = $get(userContext.cntrl);
    var curVal = userContext.getVal();
    // Fetching result...
}

此函数是名为" DDL_WebService.vb"的Web服务文件中的一种方法。它位于.vb中,正在从数据库中获取数据。

<WebMethod()> _
    Public Function fillFilter() As List(Of String)
        Dim strSQL As String

        strSQL = "select '(All)' from My_Table "

        Return getData(strSQL)
    End Function

问题:我想在fillFilter()的最后一行之后,它几乎没有时间进入SucceededCallbackWithContext()(步入命令告诉我之间没有任何事情发生)。但是,从fillFilter()的最后一行到达SucceededCallbackWithContext()大约需要7秒。

我不确定是什么花时间,我怎样才能确认并解决这个问题。

非常感谢任何帮助:)

更新: 使用Developer工具从另一个角度查看问题,我得到了sceenshot中显示的结果。现在我的问题变成了某些方法运行时间太长的可能原因(注意:对于请求时间最长的Web服务方法,我将查询从10秒加速到不到3秒,但请求时间仍然是15秒)。是否执行一个Web服务方法会影响另一个Web服务方法的速度?再次感谢! The network traffic flow of the web tool

3 个答案:

答案 0 :(得分:0)

如果要过滤数据,为什么要尝试加载所有列的所有记录? 如果你的my_table记录大约是1000或小于1000(我的意思是你有一个小的数据集)你无法理解性能问题但是一段时间后随着数据的增长(例如它达到100000),你会注意到你的服务是越来越慢。

如果您的查询不是代码中的主要查询,请首先使用浏览器开发人员工具或任何其他工具来衡量服务的响应时间,以确保问题出现在服务器端代码或javascript代码中

答案 1 :(得分:0)

尝试在发送之前压缩你的datataTable!我与你分享两个功能,允许压缩和解压缩:

 Public Shared Function CompressData(ByVal ds As DataSet) As Byte()
        Try
            Dim data As Byte()
            Dim memStream As New MemoryStream()
            Dim zipStream As GZipStream = New GZipStream(memStream, CompressionMode.Compress)
            ds.WriteXml(zipStream, XmlWriteMode.WriteSchema)
            zipStream.Close()
            data = memStream.ToArray()
            memStream.Close()
            Return data
        Catch ex As Exception
            Return Nothing
        End Try
    End Function


Public Shared Function DecompressData(ByVal data As Byte()) As DataSet
    Try
        Dim memStream As New MemoryStream(data)
        Dim unzipStream As New GZipStream(memStream, CompressionMode.Decompress)
        Dim objDataSet As New DataSet()
        objDataSet.ReadXml(unzipStream, XmlReadMode.ReadSchema)
        unzipStream.Close()
        memStream.Close()
        Return objDataSet
    Catch ex As Exception
        Return Nothing
    End Try
End Function
希望能帮到你。

答案 2 :(得分:0)

虽然我发布问题已经很长时间了,但我仍然想更新我在这个问题上的进展,感谢Beldi和mostafa的建议,并在遇到类似问题时给人一些提示。

总体而言,问题尚未解决,但我们想出了一个解决方法。

我们猜测某些查询可能需要很长时间才能完成,因此我根据开发人员工具分析了所有需要很长时间的查询。我一个接一个地测试它们,发现它们都非常快。在接下来的很长一段时间里,我一直在坚持验证开发人员工具的含义。

当我剖析以下代码时,会发生一个突破:

 $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "dataservice/getSimData_WebService.asmx/getSimsList",
        data: JSON.stringify(params),
        dataType: "json",
        success: function (data, textStatus) {
            if (textStatus == "success") {
                var thegrid = $("#jqGrid_sims")[0];
                thegrid.addJSONData(data.d);
            }
        },
        error: function (data, textStatus) {
            alert("Error from get grid data");
        }
    }); 

在这段ajax调用中,代码在执行时发出请求。从执行开始到if语句开始之间的时间是请求时间,这是开发人员工具指示的时间。如果语句花费的代码是获取时间的时间。

在查看每个ajax调用的请求时间和获取时间之后,我发现模拟功能的获取时间需要相对较长的时间。由于加载功能会导致页面被冻结,并且尝试减少冻结时间具有更多不确定性并且需要更长时间,因此我们最终决定不加载它。相反,它会在用户点击按钮时加载。

希望这可以帮助任何有类似问题的人。