我正在开发一个Web应用程序,通过dot net webmethod实时查询MS-SQL,如下所示:
的jQuery
var xhr = $.ajax({
type: "POST",
url: "page.aspx/SearchMatchingRecords",
data: "{ company:'" + company + "', country:'" + country + "', id: <%= Request.QueryString["id"] %>}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
if (data != "") {
for (var post in data) {
var results = data[post];
var output = '<table ... headers... etc';
for (var i = 0; i < results.length; i++)
{
output += "<tr><td>";
output += #DATA#
output += "</td></tr>";
}
output += '</tbody></table>';
$('[id="fsMatchingRecords"]').append(output);
}
};
return false;
}
})
}
$('[id$="BtnVerify"]').click(function () {
xhr.abort();
});
与 WebMethod
进行对话[WebMethod]
public static List<MatchingRecord> SearchMatchingRecords(string company, string country, int id)
{
SqlConnection objConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
objConn.Open();
List<MatchingRecord> mRecords = new List<MatchingRecord>();
SqlCommand objCmd2 = new SqlCommand("Page_Matching_Records", objConn);
objCmd2.CommandType = CommandType.StoredProcedure;
objCmd2.Parameters.AddWithValue("@company_1", HttpUtility.UrlDecode(company));
objCmd2.Parameters.AddWithValue("@country_2", country);
objCmd2.Parameters.AddWithValue("@id_3", id);
SqlDataReader objDr = objCmd2.ExecuteReader();
int i = 0;
if (objDr.HasRows)
{
while (objDr.Read())
{
mRecords.Add(new MatchingRecord(
Convert.ToInt32(objDr["id"]),
objDr["Rest of Data"]
))
);
}
}
objConn.Close();
return mRecords;
}
webmethod会返回结果,然后将结果实时附加到DOM中 - 对此操作的方式非常满意。
问题在于,当通用/模糊搜索词传递到数据库时,查询有时需要一段时间才能返回数据。我想在jQuery片段的底部做些什么 - 使用 abort 取消XMLHttpRequest。
在此页面等待返回的过程中,用户无法与页面进行交互。链接按钮和ASP按钮不响应,但会为返回排队,然后尽快开火。这导致了问题。
该方案意味着简单地将SQL超时或将某些麻烦的搜索词列入黑名单将难以管理,因此用户取消请求的能力至关重要。
我在这里忽略了什么?我见过很多人使用这种方法来取消jQuery POST方法。可能是这个请求还有另一层,因为服务器线程正在等待SQL服务器响应?有没有办法简单地忽略它?