Почему Поиск Azure возвращает значение NULL для вызывающего метода?C#

Место общения программистов C#
Ответить
Anonymous
 Почему Поиск Azure возвращает значение NULL для вызывающего метода?

Сообщение Anonymous »

У меня есть веб-приложение, реализующее поиск Azure. Он также использует перехват для создания фильтров для поиска перед выполнением.
Путь выполнения:
  • контроллер вызывает поставщика поиска
  • перехватчик создает фильтр, а затем вызывает поставщика поиска
  • поставщик поиска создает клиент поиска Azure
  • поставщик поиска вызывает поиск
  • поставщик поиска возвращает результаты поиска контроллеру
  • должен запуститься другой перехватчик и выполнить некоторую работу с результатами
  • контроллер обрабатывает результаты поиска.
В поставщике поиска у нас есть эти элементы данных для хранения информация для поискового клиента:

Код: Выделить всё

private static readonly string AzSearchKey = WebConfigurationManager.AppSettings["Providers.AzSearchKey"];
private static readonly string AzSearchServiceName = WebConfigurationManager.AppSettings["Providers.AzSearchServiceName"];
private static readonly string AzSearchIndexName = WebConfigurationManager.AppSettings["Providers.AzSearchIndexName"];
private static readonly string AzSearchSemanticConfig = WebConfigurationManager.AppSettings["Providers.AzSearchSemanticConfig"];
private static readonly Logger Log = LogManager.GetCurrentClassLogger();
private readonly SearchClient _client;
и конструктор:

Код: Выделить всё

public SearchProvider()
{
Uri AzSearchUrl = new Uri($"https://{AzSearchServiceName}.search.windows.net");
var cred = new AzureKeyCredential(AzSearchKey);
var options = new SearchClientOptions
{
Retry =
{
Mode = Azure.Core.RetryMode.Exponential,
MaxRetries = 6,
Delay = TimeSpan.FromMilliseconds(200),
MaxDelay = TimeSpan.FromSeconds(10)
}
};

_client = new SearchClient(AzSearchUrl, AzSearchIndexName, cred, options);
}
и упрощенный метод поиска. Я оставлю перехватчик построения фильтра, потому что он, кажется, работает — он создает фильтр — и наличие или отсутствие фильтра в поиске не имеет значения, работает ли он.

Код: Выделить всё

public async Task SearchAsync(SearchModel search, IPrincipal principal)
{
var term = string.IsNullOrWhiteSpace(search.SearchTerm) ? "*" : EscapeSearchTerm(search.SearchTerm);

var options = new SearchOptions
{
Size = 1,// search.PageSize,
//Skip = Math.Max((search.PageNumber ?? 0 - 1) * search.PageSize, 0),
IncludeTotalCount = true,
//QueryType = Azure.Search.Documents.Models.SearchQueryType.Simple,
//SearchMode = Azure.Search.Documents.Models.SearchMode.Any
};

if (!string.IsNullOrWhiteSpace(search.OptionalFilter))
{
options.Filter = search.OptionalFilter;
}

try
{
var g = _client.GetDocumentCount();
var azresult = await _client.SearchAsync(term, options);
var page = azresult.Value.GetResultsAsync().AsPages();
var tootoo = azresult.Value;

return new ResultContainer { Results = new List(), LongTotal = 0, SearchModel = search, Skip = 0, Take = 0, Total = 0 };
}
catch (Exception ex)
{
Log.Error(ex, "Error doing Azure Search");
return new ResultContainer { Results = new List(), LongTotal = 0, SearchModel = search, Skip = 0, Take = 0, Total = 0 };
}
}
А в контроллере мы называем это так:

Код: Выделить всё

var results = await _providerInstance.SearchAsync(searchModel, User);
Поэтому, когда я запускаю действие контроллера для поиска, оно попадает в то место, куда мы вызываем

Код: Выделить всё

var azresult = await _client.SearchAsync(term, options);
Предыдущая строка представляет собой небольшую отладку, которую я ввел, и в точке останова, где мы ожидаем ее срабатывания, "g" имеет значение, которое отражает количество элементов в индексе поиска. Итак, я знаю, что часть Azure работает, по крайней мере, таким образом.
Я пытался сократить количество результатов до 1, удалить фильтры, протестировать фильтры вне кода на сайте поиска Azure, и всегда _client.SearchAsync просто завершается. Он не генерирует исключение, он завершается, и поставщик.SearchAsync возвращает значение null. Это генерирует исключение nullreferenceException в контроллере. Так что из этой ошибки для меня нет никакой полезной информации. Если я попытаюсь использовать F11, чтобы «вступить» в метод, который просто загрузит меня прямо на контроллер, где находится исключение.
Обновить
Я думаю, что это может иметь какое-то отношение к перехватчику. Вызываемый метод является асинхронным, но перехватчик не имеет асинхронных частей. Никаких ожиданий или чего-то еще. Поэтому я думаю, что это возвращается и преждевременно передается поисковому провайдеру.
Что я могу сделать, чтобы хотя бы отладить это, не говоря уже о решении проблемы?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ing-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»