Запрос Spotfire для childItems папки занимает слишком много времени - PullRequest
1 голос
/ 17 мая 2019

На нашей странице указателя отображается список файлов анализа, расположенных в папке (у каждого пользователя есть папка в библиотеке Spotfire).Проблема в производительности.Для получения 50 библиотечных элементов требуется ~ 5 секунд, и поскольку это происходит на нашей целевой странице, загрузка всей страницы занимает слишком много времени.Мне интересно, если я делаю что-то не так при запросе к серверу.

У нас есть метод GetWorkbooks() (см. Ниже) в нашем сервисе, который вызывается при загрузке целевой страницы.Он использует WcfClient, который выставляет LibraryService, поэтому мы можем запросить точечный огонь.

public IList<Workbook> GetWorkbooks(string email, bool isBufferFolder = false)
{
    var targetFolderPath = isBufferFolder ? _sharingBufferFolderPath : _userFolderPath;

    var userFolderId = _spotfireUserDataService._libraryService
        .Invoke(x => x.pathToId(new pathToId($"{targetFolderPath}/{email}", SpotfireLibraryItemType.Folder))).@return;

    var workBooks = new List<Workbook>();

    // only retrieve workbooks if there is a user folder
    if (userFolderId != null)
    {
        var libraryItems = _spotfireUserDataService._libraryService.Invoke(x => x.getChildItems(new getChildItems(userFolderId))).@return;
        // check if there are any items in the folder, if not return the above empty list
        if (libraryItems != null)
        {// get all analysis/workbook ('dxp') files for the user
            workBooks = libraryItems
                .Where(i => i.type == SpotfireLibraryItemType.DXP)
                .OrderByDescending(j => j.accessed.Date)
                .Select(x => new Workbook {
                    Name = x.title,
                    Id = x.id,
                    ModifiedDate = x.modified,
                    Metadata = new WorkbookMetadata
                    {
                        SharedBy = x.properties.Where(i => i.key == "SharedBy").FirstOrDefault()?.values[0],
                        SharedDate = new DateTime(Convert.ToInt64(x.properties.Where(i => i.key == "SharedDate").FirstOrDefault()?.values[0]))
                    }
                })
                .ToList();
        }
    }

    return workBooks;
}

Это скриншот вызова:

enter image description here

Это иерархия библиотеки Spotfire:

-DNA
----UserFolder
--------user.name@company.com

Это мой WcfClient.cs:

public class WcfClient<T> : IDisposable
{
    private T _wrappedChannel;
    private static readonly object _channelLock = new object();
    private readonly ChannelFactory<T> _factory;
    private readonly ITokenProvider _tokenProvider;

    public WcfClient(ChannelFactory<T> factory, ITokenProvider tokenProvider)
    {
        _factory = factory;
        _tokenProvider = tokenProvider;
    }

    protected T WrappedChannel
    {
        get
        {
            lock (_channelLock)
            {
                if (!Equals(_wrappedChannel, default(T)))
                {
                    var state = ((ICommunicationObject)_wrappedChannel).State;
                    if (state == CommunicationState.Faulted)
                    {
                        _wrappedChannel = default(T);
                    }
                }
                if (Equals(_wrappedChannel, default(T)))
                {
                    _wrappedChannel = _factory.CreateChannel();
                }
            }
            return _wrappedChannel;
        }
    }

    public void Invoke(Action<T> action)
    {
        try
        {
            action(WrappedChannel);
        }
        catch (FaultException)
        {
            throw;
        }
        catch (MessageSecurityException)
        {
            _tokenProvider.Invalidate();
            action(WrappedChannel);
        }
        catch (CommunicationException)
        {
            action(WrappedChannel);
        }
    }

    public TResult Invoke<TResult>(Func<T, TResult> action)
    {
        try
        {
            return action(WrappedChannel);
        }
        catch (FaultException)
        {
            throw;
        }
        catch (MessageSecurityException)
        {
            _tokenProvider.Invalidate();
            return action(WrappedChannel);
        }
        catch (CommunicationException e)
        {
            return action(WrappedChannel);
        }
    }
}

Может кто-нибудь дать какие-нибудь советы о том, как я могу улучшить производительность?

...