AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.03.2009, 14:39   #1  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
! Быстродействие CrmService
Реализовали такой функционал. На основе данных из сайта в CRM создаются Интересы, Контакты, Счета и куча других кастомных объектов. Но ради безопасности не стали писать доступ к веб-сервисам CRM из самого сайта, а создали промежуточный веб-сервис на asp, который принимает SOAP запросы от сайта и с другой стороны заносит данные в CRM.

Проблема: когда приходит запрос из сайта каждый раз создается экземпляр класса CrmService - это занимает много времени (20-60 сек) и сайт, не дождавшись ответа, вываливается с TimeoutException. Но следующие затем запросы обрабатываются мгновенно -создание экземпляра класса CrmService проходит сразу. Похоже где-то что-то кэшируется. Но через пару часов (суток) снова тратится много времени на этом же шаге.

Для решения данной проблемы наткнулся на след. тему:
http://social.microsoft.com/forums/e...-d395bff00c5a/

Еще нашел полезную ссылку для сериализации WebReference:
http://uwekaessner.spaces.live.com/b...908E!175.entry

Сделал как указано в последней ссылке:
1. Сгенерировал файл с Xml-сериализацией для web-reference CrmService.
2. В Reference для классов CrmService, Request, Response, BusinessEntity закомментировал аттрибуты
Код:
[System.Xml.Serialization.XmlIncludeAttribute
и добавил аттрибут
Код:
[System.Xml.Serialization.XmlSerializerAssemblyAttribute(AssemblyName = "CrmServicePerformance.XmlSerializers")]
Итог:
Скорость при создании CrmService увеличилась.
Но на выполнение CrmService.Create(), CrmService.Execute(), CrmService.RetrieveMultiple() все равно уходит много времени. Иногда вся логика выполняется аж за 2 минуты.
Но следующие запросы могут выполняться за 2 секунды.

Что еще можно сделать?
Старый 12.03.2009, 15:36   #2  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
В Windows Communication Foundation (.NET 3.0 и выше) Web сервисы можно реализовать с опцией инстанциирования и хранения ссылки. В принципе Ваш вариант. Попробую найти больше информации
Старый 13.03.2009, 06:35   #3  
ShurikEv is offline
ShurikEv
CRM
 
213 / 28 (1) +++
Регистрация: 25.04.2006
Адрес: г. Новосибирск
В 3ке мы для этого использовали Fetch запросы.
__________________
MS CRM 3.0/4.0
Sharepoint 2003, MOSS 2007/2010
Старый 13.03.2009, 06:59   #4  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Цитата:
В 3ке мы для этого использовали Fetch запросы.
Так быстрее?
Цитата:
В Windows Communication Foundation (.NET 3.0 и выше) Web сервисы можно реализовать с опцией инстанциирования и хранения ссылки. В принципе Ваш вариант. Попробую найти больше информации
Буду очень благодарен.
Старый 13.03.2009, 11:48   #5  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Цитата:
Сообщение от Bakai Madybaev Посмотреть сообщение
Так быстрее?
Сомнительно. Один фиг надо звать CrmService.Fetch(). Хотя сервис можно, вроде бы как не инстанцировать, а обращаться через soap-http... В принципе никто не мешает вам поступать так же и с остальными ф-циями.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 13.03.2009, 15:54   #6  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Иногда даже вот такое исключение выходит:
Цитата:
System.Threading.ThreadAbortException: Thread was being aborted.
at System.Array.Clear(Array array, Int32 index, Int32 length)
at System.Collections.ArrayList.Clear()
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
Старый 16.03.2009, 07:53   #7  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Цитата:
Сомнительно. Один фиг надо звать CrmService.Fetch(). Хотя сервис можно, вроде бы как не инстанцировать, а обращаться через soap-http... В принципе никто не мешает вам поступать так же и с остальными ф-циями.
Для инстанциирования CrmService времени после предварительной xml-сериализации уходит уже немного - очень много времени уходит на CrmService.RetrieveMultiple(query)

Если использовать Fetch, то отпадет необходимость инстанцировать объекты QueryExpression, FilterExpression и т.д., т.к. посылаться будет запрос в виде xml-строки?

Есть ли настройки в IIS, которые указывают как долго нужно держать в кэш xml-сериализацию?
Старый 17.03.2009, 14:15   #8  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Нашел в справке SDK в теме Using FetchXML:
Цитата:
Generally, the RetrieveMultiple method performs faster than the Fetch method because it does not have to parse the query.
Старый 17.03.2009, 14:41   #9  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
У нас на одном из проектов была сделана интеграция с учетно-логистической системой заказчика. Интеграция делалась через промежуточную шину данных, да так и была брошена в состоянии полутестовой разработки. Так вот к чему я это: каждый раз при сохранении, изменении, удалении объекта этой системы, стартует обработчик события шины. Он каждый раз вычитывает из XML файла на диске (!!!) схему мапирования атрибутов, создает и вызывает сервис CRM, но ни разу мы не испытывали никаких проблем производительности! Может не в сервисе дело, Bakai?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 17.03.2009, 15:20   #10  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Артем, спасибо за внимание к этой теме - приведу код:
X++:
      TraceManager.Log(System.Diagnostics.TraceLevel.Verbose, "Start CrmService.RetrieveMultiple() " + entityName.ToString(), "");
      try
      {
          if (!debug) beCol = service.RetrieveMultiple(query);
      }
      catch (SoapException ex)
      {
        TraceManager.Log(System.Diagnostics.TraceLevel.Error, "Ошибка в методе Fill(): entityName =" + entityName + "; " + ex.ToString() + ex.Detail.InnerText, "");
        throw new BIBCInternalException("Fill() method error: entityName =" + entityName + "; " +ex.ToString() + ex.Detail.InnerText);
      }
      catch (Exception ex)
      {
        TraceManager.Log(System.Diagnostics.TraceLevel.Error, "Ошибка в методе Fill(): entityName =" + entityName + "; " + ex.ToString(), "");
        throw new BIBCInternalException("Fill() method error: entityName =" + entityName + "; " + ex.ToString());
      }
      if (beCol == null) return null;

      TraceManager.Log(System.Diagnostics.TraceLevel.Verbose, "Filling complete successfully! Fetched " + beCol.BusinessEntities.Length + "rows.", "");
А вот и Trace данного кода:
X++:
w3wp.exe Information: 0 : 2009-03-17T13:45:46.4678697	CrmInterface	Start CrmService.RetrieveMultiple() lead	

w3wp.exe Information: 0 : 2009-03-17T13:46:38.8803507	CrmInterface	Filling complete successfully! Fetched 0rows.
Как видно, на исполнения этого кода ушло 52 секунды.

Но последующее выполнение кода происходит намного быстрее (сотые доли секунды):
X++:
w3wp.exe Information: 0 : 2009-03-17T13:47:00.5639643	CrmInterface	Start CrmService.RetrieveMultiple() lead	

w3wp.exe Information: 0 : 2009-03-17T13:47:00.5795865	CrmInterface	Filling complete successfully! Fetched 0rows.

Последний раз редактировалось Bakai Madybaev; 17.03.2009 в 15:24.
Старый 19.03.2009, 07:07   #11  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Может быть дело не в инстанциированном веб-сервисе, а самом веб-сервисе CrmService на CRM-сервере?

Где можно посмотреть Логи на CRM сервера, как долго обрабатывается запрос QueryExpression?
Старый 19.03.2009, 08:35   #12  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
точно такая же история с вызовом методов:
X++:
CrmService.Update();
CrmService.Create();
Старый 20.03.2009, 00:54   #13  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Цитата:
Сообщение от Bakai Madybaev Посмотреть сообщение
Может быть дело не в инстанциированном веб-сервисе, а самом веб-сервисе CrmService на CRM-сервере?

Где можно посмотреть Логи на CRM сервера, как долго обрабатывается запрос QueryExpression?
Попробуйте запустить SQL Profiler. Может тормозит SQL и сам сервис тут не при чем.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 20.03.2009, 10:46   #14  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Создали задачу, которая периодически прогоняет веб-сервис (запуск RetrieveMultiple(), Update(), Create()) не затрагивая данные, чтобы поддерживать кэш - вроде помогло.
Корявое решение, но решение
Старый 20.03.2009, 13:02   #15  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Сингельтоном класс сервиса делать не пробовали? Может он статиком жить дольше будет - пусть создается при старте сайта. А то тратить ресурсы на профилактическое обновление кеша - неразумно как-то.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 20.03.2009, 16:21   #16  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Артем,
Статиком пробовали создать класс - не помогло. Не помню точно из-за чего - найду логи - отпишусь...
Старый 21.03.2009, 22:57   #17  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Верю вам на слово. У меня довольно маленький опыт программирования под ASP - вряд ли смогу чем-то помочь. Разе что мы поищем в чем разница между нашими ситуациями. Я и когда отлаживался тормозов не наблюдал - проект собирался дольше, чем я ждал ответа от сервера, хотя он был размазан по 2 виртуалкам!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Microsoft Dynamics CRM Team Blog: Building Rich-Client Dashboards for Microsoft Dynamics CRM with Windows Presentation Foundation Blog bot Dynamics CRM: Blogs 1 31.03.2009 13:24
Странное ограничение FilterdAttributes в PluginRegistration Alir Dynamics CRM: Разработка 1 22.03.2009 03:59
Быстродействие CRM 4.0 Alpi Dynamics CRM: Администрирование 3 18.03.2009 22:38
аутентификация crmService if_maks Dynamics CRM: Разработка 2 25.12.2008 11:52
Обращение к CrmService sergeyjb Dynamics CRM: Разработка 23 05.11.2008 14:22

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:05.