12.03.2009, 14:39 | #1 |
Участник
|
Быстродействие 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 |
Участник
|
В Windows Communication Foundation (.NET 3.0 и выше) Web сервисы можно реализовать с опцией инстанциирования и хранения ссылки. В принципе Ваш вариант. Попробую найти больше информации
|
|
13.03.2009, 06:35 | #3 |
CRM
|
В 3ке мы для этого использовали Fetch запросы.
__________________
MS CRM 3.0/4.0 Sharepoint 2003, MOSS 2007/2010 |
|
13.03.2009, 06:59 | #4 |
Участник
|
Цитата:
В 3ке мы для этого использовали Fetch запросы.
Цитата:
В Windows Communication Foundation (.NET 3.0 и выше) Web сервисы можно реализовать с опцией инстанциирования и хранения ссылки. В принципе Ваш вариант. Попробую найти больше информации
|
|
13.03.2009, 11:48 | #5 |
Moderator
|
Сомнительно. Один фиг надо звать CrmService.Fetch(). Хотя сервис можно, вроде бы как не инстанцировать, а обращаться через soap-http... В принципе никто не мешает вам поступать так же и с остальными ф-циями.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
13.03.2009, 15:54 | #6 |
Участник
|
Иногда даже вот такое исключение выходит:
Цитата:
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 |
Участник
|
Цитата:
Сомнительно. Один фиг надо звать CrmService.Fetch(). Хотя сервис можно, вроде бы как не инстанцировать, а обращаться через soap-http... В принципе никто не мешает вам поступать так же и с остальными ф-циями.
Если использовать Fetch, то отпадет необходимость инстанцировать объекты QueryExpression, FilterExpression и т.д., т.к. посылаться будет запрос в виде xml-строки? Есть ли настройки в IIS, которые указывают как долго нужно держать в кэш xml-сериализацию? |
|
17.03.2009, 14:15 | #8 |
Участник
|
Нашел в справке 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 |
Moderator
|
У нас на одном из проектов была сделана интеграция с учетно-логистической системой заказчика. Интеграция делалась через промежуточную шину данных, да так и была брошена в состоянии полутестовой разработки. Так вот к чему я это: каждый раз при сохранении, изменении, удалении объекта этой системы, стартует обработчик события шины. Он каждый раз вычитывает из XML файла на диске (!!!) схему мапирования атрибутов, создает и вызывает сервис CRM, но ни разу мы не испытывали никаких проблем производительности! Может не в сервисе дело, Bakai?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.03.2009, 15:20 | #10 |
Участник
|
Артем, спасибо за внимание к этой теме - приведу код:
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.", ""); 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. Но последующее выполнение кода происходит намного быстрее (сотые доли секунды): 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 |
Участник
|
Может быть дело не в инстанциированном веб-сервисе, а самом веб-сервисе CrmService на CRM-сервере?
Где можно посмотреть Логи на CRM сервера, как долго обрабатывается запрос QueryExpression? |
|
19.03.2009, 08:35 | #12 |
Участник
|
точно такая же история с вызовом методов:
X++: CrmService.Update(); CrmService.Create(); |
|
20.03.2009, 00:54 | #13 |
Moderator
|
Попробуйте запустить SQL Profiler. Может тормозит SQL и сам сервис тут не при чем.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
20.03.2009, 10:46 | #14 |
Участник
|
Создали задачу, которая периодически прогоняет веб-сервис (запуск RetrieveMultiple(), Update(), Create()) не затрагивая данные, чтобы поддерживать кэш - вроде помогло.
Корявое решение, но решение |
|
20.03.2009, 13:02 | #15 |
Moderator
|
Сингельтоном класс сервиса делать не пробовали? Может он статиком жить дольше будет - пусть создается при старте сайта. А то тратить ресурсы на профилактическое обновление кеша - неразумно как-то.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
20.03.2009, 16:21 | #16 |
Участник
|
Артем,
Статиком пробовали создать класс - не помогло. Не помню точно из-за чего - найду логи - отпишусь... |
|
21.03.2009, 22:57 | #17 |
Moderator
|
Верю вам на слово. У меня довольно маленький опыт программирования под ASP - вряд ли смогу чем-то помочь. Разе что мы поищем в чем разница между нашими ситуациями. Я и когда отлаживался тормозов не наблюдал - проект собирался дольше, чем я ждал ответа от сервера, хотя он был размазан по 2 виртуалкам!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|