asp.net - 加快 Web 服务的自动完成速度并避免过多的方法调用

标签 asp.net javascript jquery sql-server

所以我的 jquery 自动完成“工作”了,但它有点烦躁,因为每次 keydown() 触发时我都会调用 webservice 方法,所以我有很多方法挂起,有时让“自动”工作我必须把它打出来然后退格一点,因为我假设它的返回值有点慢。我已将查询结果限制为 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);
            }
            }
        });
    });

网络服务.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

我确定我只是在解决这个问题时犯了一点错误,或者没有更好地平衡通话或其他事情。

非常感谢!

最佳答案

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

同样,您必须先解决这个问题!

完成后,使用“延迟”值。我假设这是在将查询发送到服务器之前在按键之间等待的时间量?您希望它等待您的用户暂停他们的输入,然后发送请求,以避免无关的调用使您的服务器重载。

您还应该使用 try..catch..finally 并在完成后处理您的连接。

顺便说一句,如果您的查询执行不佳,请尝试在该列上添加索引。如果你没有索引,“喜欢”语句就很糟糕......

关于asp.net - 加快 Web 服务的自动完成速度并避免过多的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3025692/

相关文章:

javascript - 为什么 D3 过渡不起作用

javascript - 不推荐使用不带 'cursor' 选项的聚合命令

asp.net - 使用二维码登录网站

c# - 如何在 ASP.Net Web Forms Identity 中使用 "username"而不是 "email address"登录

javascript - 如何在异步方法asp net中显示警报

javascript - 为什么 phonegap click 事件会触发两次?

c# - 如何在asp.net web表单中使用方法="post"的表单

javascript - Joomla页面加载功能

javascript - 将 PHP 变量传递给 Javascript

jquery - 水平滚动 - 页面小于屏幕尺寸