加速Web服务以自动完成并避免过多的方法调用

Jon*_*now 5 javascript sql-server asp.net jquery

所以我的jquery自动完成'工作',但它有点烦躁,因为每次keydown()触发时我都调用webservice方法,所以我得到很多方法挂起,有时让"auto"工作我必须键入它和退格有点因为我假设它的返回值有点慢.我已将查询结果限制为8以最小化时间.有什么我可以做的让这个更快一点吗?如果我没有让它更具响应性,这件事似乎几乎没用.

JavaScript的

$("#clientAutoNames").keydown(function () {
        $.ajax({
            type: "POST",
            url: "WebService.asmx/LoadData",
            data: "{'input':" + JSON.stringify($("#clientAutoNames").val()) + "}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                if (data.d != null) {
                    var serviceScript = data.d;
                }
                $("#autoNames").html(serviceScript);
                $('#clientAutoNames').autocomplete({
                    minLength: 2,
                    source: autoNames,
                    delay: 100,
                    focus: function (event, ui) {
                        $('#project').val(ui.item.label);
                        return false;
                    },
                    select: function (event, ui) {
                        $('#clientAutoNames').val(ui.item.label);
                        $('#projectid').val(ui.item.value);
                        $('#project-description').html(ui.item.desc);
                        pkey = $('#project-id').val;
                        return false;
                    }
                })
            .data("autocomplete")._renderItem = function (ul, item) {
                return $("<li></li>")
                    .data("item.autocomplete", item)
                    .append("<a>" + item.label + "<br>" + item.desc + "</a>")
                    .appendTo(ul);
            }
            }
        });
    });
Run Code Online (Sandbox Code Playgroud)

WebService.asmx

<WebMethod()> _
Public Function LoadData(ByVal input As String) As String
    Dim result As String = "<script>var autoNames = ["
    Dim sqlOut As Data.SqlClient.SqlDataReader
    Dim connstring As String = *Datasource*

    Dim strSql As String = "SELECT TOP 2 * FROM v_Clients WHERE (SearchName Like '" + input + "%') ORDER BY SearchName"
    Dim cnn As Data.SqlClient.SqlConnection = New Data.SqlClient.SqlConnection(connstring)
    Dim cmd As Data.SqlClient.SqlCommand = New Data.SqlClient.SqlCommand(strSql, cnn)
    cnn.Open()

    sqlOut = cmd.ExecuteReader()
    Dim c As Integer = 0
    While sqlOut.Read()

        result = result + "{"
        result = result + "value: '" + sqlOut("ContactID").ToString() + "',"
        result = result + "label: '" + sqlOut("SearchName").ToString() + "',"
        'result = result + "desc: '" + title + " from " + company + "',"
        result = result + "},"

    End While
    result = result + "];</script>"
    sqlOut.Close()
    cnn.Close()

    Return result
End Function
Run Code Online (Sandbox Code Playgroud)

我敢肯定,我只是在解决这个问题,或者没有更好地平衡通话或其他事情.

非常感激!

jve*_*ema 8

首先,你必须调整你的查询.您没有使用参数化查询,所以您只是在乞求SQL注入攻击.

再一次,你必须先修复它!

完成后,使用"延迟"值.我假设在将查询发送到服务器之前,它在键盘之间等待的时间是多少?您希望它等待您的用户暂停键入,然后发送请求,以避免使用无关的调用使服务器超载.

你也应该使用try..catch..finally并在完成后处理你的连接.

顺便说一句,如果您的查询执行效果不佳,请尝试在该列上添加索引.如果你没有索引,'赞'语句很糟糕......