На нашей странице указателя отображается список файлов анализа, расположенных в папке (у каждого пользователя есть папка в библиотеке 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;
}
Это скриншот вызова:
Это иерархия библиотеки 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);
}
}
}
Может кто-нибудь дать какие-нибудь советы о том, как я могу улучшить производительность?