取消对ASP.Net WebMethod的jQuery POST

时间:2015-03-03 09:55:09

标签: jquery asp.net sql-server ajax webmethod

我正在开发一个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服务器响应?有没有办法简单地忽略它?

0 个答案:

没有答案