Путь выполнения:
- контроллер вызывает поставщика поиска
- перехватчик создает фильтр, а затем вызывает поставщика поиска
- поставщик поиска создает клиент поиска 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);
Я пытался сократить количество результатов до 1, удалить фильтры, протестировать фильтры вне кода на сайте поиска Azure, и всегда _client.SearchAsync просто завершается. Он не генерирует исключение, он завершается, и поставщик.SearchAsync возвращает значение null. Это генерирует исключение nullreferenceException в контроллере. Так что из этой ошибки для меня нет никакой полезной информации. Если я попытаюсь использовать F11, чтобы «вступить» в метод, который просто загрузит меня прямо на контроллер, где находится исключение.
Обновить
Я думаю, что это может иметь какое-то отношение к перехватчику. Вызываемый метод является асинхронным, но перехватчик не имеет асинхронных частей. Никаких ожиданий или чего-то еще. Поэтому я думаю, что это возвращается и преждевременно передается поисковому провайдеру.
Что я могу сделать, чтобы хотя бы отладить это, не говоря уже о решении проблемы?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ing-method
Мобильная версия