Веб-метод периодически не отвечает на вызов AJAX - PullRequest
0 голосов
/ 17 августа 2011

Я использую автозаполнение пользовательского интерфейса jQuery для текстового поля, которое выполняет обратный вызов обработчика ASP.NET .ashx.

JavaScript:

    $partsSearch.autocomplete({
        delay: 300,
        source: '/Services/PartsCovered.ashx',
        minLength: 3,
        select: function(event, ui) {
            $(event.target).val(ui.item.label);
            findPartsByPhrase(ui.item.value);
            return false;
        },
        focus: function(event, ui) {
            $(event.target).val(ui.item.label);
            return false;
        }
    });

C #:

[WebService(Namespace = "http://www.blah.co.uk/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class PartsCovered : IHttpHandler
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="context"></param>
    public void ProcessRequest(HttpContext context)
    {
        context.Response.Clear();
        context.Response.ContentType = "application/json";

        List<AutoCompleteEntry> autoCompleteList = PartsUtils.PartSuggestionsGet(context.Request.QueryString["term"]);

        JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
        context.Response.Write(jsSerializer.Serialize(autoCompleteList));
        context.Response.End();
    }

    /// <summary>
    /// 
    /// </summary>
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

РЕДАКТИРОВАТЬ: Добавление дополнительного кода C #:

public static List<AutoCompleteEntry> PartSuggestionsGet(string query)
    {
        List<AutoCompleteEntry> suggestions = new List<AutoCompleteEntry>();

        using (SqlConnection sqlConnection = SqlDatabaseUtils.PortalSqlConnection)
        {
            try
            {
                SqlCommand sqlCommand = new SqlCommand("Parts_MatchBySearchPhraseGet", sqlConnection)
                {
                    CommandType = CommandType.StoredProcedure
                };
                sqlCommand.Parameters.AddWithValue("@SearchPhrase", query);
                sqlCommand.CommandTimeout = 1;

                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
                DataTable results = new DataTable();

                sqlDataAdapter.Fill(results);

                foreach (DataRow row in results.Rows)
                {
                    suggestions.Add(new AutoCompleteEntry(row["PartName"].ToString(), row["PartName"].ToString(), Convert.ToBoolean(row["Variant"])));
                }
            }
            catch (Exception ex)
            {
                LoggingUtils.AddEntry("Part suggestions failed.", ex, typeof(PartsUtils), LoggingUtils.LogLevel.Warn);
            }
        }

        suggestions.Sort();

        return suggestions;
    }

и хранимой процедуры:

ALTER PROCEDURE [dbo].[Parts_MatchBySearchPhraseGet]
@SearchPhrase   nvarchar(50)

КАК НАЧАТЬ УСТАНОВИТЬ NOCOUNT ON;

(SELECT     PartName,
            Included,
            0 AS Variant
FROM        Parts_Covered
WHERE       PartName LIKE '%' + @SearchPhrase + '%')

UNION ALL

(SELECT     V.VariantName AS PartName,
            P.Included,
            1 AS Variant
FROM        Parts_Covered AS P
INNER JOIN  Parts_Covered_Variants AS V
ON          P.PartID = V.PartID
WHERE       V.VariantName LIKE '%' + @SearchPhrase + '%')

ORDER BY    PartName ASC

END

Это работает большую часть времени, но затем перестает отвечать на запросы.В FireBug вы можете видеть, что запрос AJAX зависает, попытка получить доступ к любой другой странице на сайте также не отвечает, поэтому она должна быть веб-приложением.Я также выполнил профилирование базы данных, и это не зависает - запрос не выполняется до последнего момента, пока запрос не вернется к жизни.

Любые предложения приветствуются.

Dave

...