'504 - Время ожидания шлюза' при индексировании предметов в Episerver Find - PullRequest
0 голосов
/ 29 ноября 2018

При индексировании элементов происходит сбой , иногда , и он дает

The remote server returned an error: (504) Gateway Timeout. [The remote server returned an error: (504) Gateway Timeout.]

Логика индексации здесь, как показано ниже,

var client = EPiServer.Find.Framework.SearchClient.Instance;
List<ItemModel> items = getItems(); // Get more than 1000 items
List<ItemModel> tempItems = new List<ItemModel>();

//Index 50 items at a time
foreach(var item in items)
{
    tempItems.Add(item);
    if (tempItems.Count == 50)
    {
        client.Index(tempItems);
        tempItems.Clear();
    }
}

Что вызывает этослучиться?

Примечание. Вышеупомянутая ItemModel - это пользовательская модель, в которой не реализованы интерфейсы (например, IContent).И items - это список ItemModel объектов.

Дополнительная информация:
EPiServer.Find.Framework версия13.0.1
EPiServer.CMS.Core версия 11.9.2

1 Ответ

0 голосов
/ 30 ноября 2018

Я всегда считал SearchClient немного отрывочным, когда манипулирует данными в Find, насколько я понял (но я должен проверить это), что SearchClient подчиняется ограничениям запроса Episerver Findи при выполнении больших операций в циклах это имеет тенденцию превышать время ожидания.

Вместо этого используйте ContentIndexer, то есть

// Use this or injected parameter
var loader = ServiceLocator.Current.GetInstance<IContentLoader>();

// Remove all children or not
var cascade = true;

ContentReference entryPoint = ...where you want to start

// Get all indexable languages from Find
Languages languages = SearchClient.Instance.Settings.Languages;

// Remove all current instances of all languages below the selected content node
//languages.ForEach(x => ContentIndexer.Instance.RemoveFromIndex(entryPoint, cascade.Checked, x.FieldSuffix));

foreach (var lang in languages)
{
    if (cascade)
    {
        var descendents = loader.GetDescendents(entryPoint);

        foreach (ContentReference descendent in descendents)
        {
            ContentIndexer.Instance.RemoveFromIndex(descendent, false, lang.FieldSuffix);
        }
    }

    // Try delete the entrypoint
    var entryTest = loader.Get<IContent>(entryPoint, new CultureInfo(lang.FieldSuffix));
    if (entryTest != null)
    {
        var delRes = ContentIndexer.Instance.Delete(entryTest);
    }
}

Это самый пуленепробиваемый способ удаления содержимого из индекса, насколько я понял.

...