为文件夹的childItems查询Spotfire花费的时间太长

时间:2019-05-17 07:51:17

标签: spotfire tibco

“索引”页面显示位于文件夹中的分析文件列表(每个用户在Spotfire的库中都有一个文件夹)。问题是性能。获取50个图书馆物品大约需要5秒钟,而且由于这是在我们的目标网页上发生的,因此整个页面的加载时间太长。我想知道查询服务器时是否做错了什么。

我们的服务中有一个方法GetWorkbooks()(请参见下文),该方法在目标网页加载时被调用。它使用WcfClient公开LibraryService,以便我们查询Spotfire。

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);
        }
    }
}

任何人都可以提供有关如何改善性能的提示吗?

0 个答案:

没有答案