Обновление пакета SDK для поиска Azure с версии 5.0.3 до версии 9. Поисковый вызов зависает

После обновления .net Azure Search SDK до версии 9 я не могу выполнять поиск. Звонок просто зависает:

    azureSearchIndexClient.Documents.Search(query, parameters);

Я не получаю сообщения об ошибке, все работало на 5.0.3, я все еще могу создавать, заполнять и удалять индексы в версии 9. Без ответа мне мало что нужно сделать ...


person Ryan    schedule 13.05.2019    source источник
comment
В каком контексте выполняется код? Классический ASP.NET? ASP.NET Core? В качестве обходного пути вы можете попробовать вызвать асинхронную версию метода? А пока мы продолжим расследование.   -  person Bruce Johnston    schedule 14.05.2019
comment
@BruceJohnston Спасибо за ответ, я использую классический .NET Framework 4.6.2. Пробовал асинхронную версию, теперь код виснет на Task.Wait();   -  person Ryan    schedule 14.05.2019
comment
Что я пытаюсь выяснить, так это потоковую модель приложения, которое вы пишете. Это веб-приложение? Консольное приложение ...? Это поможет нам воспроизвести проблему.   -  person Bruce Johnston    schedule 14.05.2019
comment
Это веб-приложение .NET MVC. Кроме того, query = * и SearchParameters - это просто некоторые значения по умолчанию QueryType.Full, IncludeTotalResultsCount = true, Skip = 0, Top = 50.   -  person Ryan    schedule 14.05.2019
comment
Спасибо, это сужает круг вопросов. Пока мы проводим расследование, вы можете попробовать еще одну вещь: вместо использования Task.Wait сделайте всю цепочку вызовов асинхронной, вплоть до вашего контроллера.   -  person Bruce Johnston    schedule 14.05.2019
comment
К вашему сведению, эта проблема отслеживается здесь: github.com/Azure/azure -sdk-for-net / issues / 6254   -  person Bruce Johnston    schedule 14.05.2019
comment
Еще один возможный обходной путь, пока я продолжаю исследовать: попробуйте установить для SearchIndexClient.UseHttpGetForQueries значение true.   -  person Bruce Johnston    schedule 14.05.2019
comment
Установка для UseHttpGetForQueries значения true фактически дала мне ошибку, с которой я мог работать, а затем смог получить некоторые результаты. Спасибо!   -  person Ryan    schedule 15.05.2019


Ответы (2)


Это ошибка SDK версии 9.0.0, отслеживаемая здесь: https://github.com/Azure/azure-sdk-for-net/issues/6254 С тех пор он был исправлен в версии 9.0.1, которая теперь доступна для загрузки на NuGet. Версия 8.0.0-preview все еще подвержена этой ошибке на момент написания этой статьи.

Причина в том, что отсутствует вызов ConfigureAwait(false), что приводит к тупиковой ситуации при вызове SDK в контексте классического приложения ASP.NET.

Ошибка влияет только на путь кода, используемый для отправки запросов POST. Вот почему установка UseHttpGetForQueries на true - эффективное решение. Однако это следует использовать только как временное решение, пока исправление не будет доступно, особенно если ваше приложение отправляет очень большие запросы, которые могут не соответствовать строке запроса URL.

Также обратите внимание, что взаимоблокировка возникает только при блокировке Задачи, возвращаемой асинхронным методом. Синхронные методы SDK делают это внутренне. В ASP.NET рекомендуется сделать методы контроллера асинхронными, а также все вызываемые ими методы, которые потенциально могут выполнять операции ввода-вывода, включая методы пакета SDK для поиска Azure. Это предотвращает блокировку потоков ОС, что значительно увеличивает масштабируемость вашего приложения. Это также позволяет избежать проблем с потенциальной взаимоблокировкой из-за пропущенных вызовов ConfigureAwait(false).

person Bruce Johnston    schedule 16.05.2019

Установка SearchIndexClient.UseHttpGetForQueries = true вернула мне ошибку для работы, без этого вызов просто зависал.

person Ryan    schedule 14.05.2019
comment
Рад, что ты разблокирован. Обратите внимание, что это всего лишь обходной путь. Если вы отправляете очень большие запросы, лучше не использовать UseHttpGetForQueries. Как только исправление основной проблемы зависания будет готово, я опубликую здесь более подробный ответ. - person Bruce Johnston; 15.05.2019
comment
@Ryan - это обходной путь или он просто выдает ошибку, а не зависает? - person David W Gray; 16.05.2019
comment
Ошибка, о которой упоминал Райан, заключается в том, что если вы установите для SearchParameters.Filter пустую строку вместо null, вызов Search завершится с ошибкой с CloudException, но только если для UseHttpGetForQueries установлено значение true. - person Bruce Johnston; 16.05.2019