2016-11-28 5 views
5

В настоящее время я просматриваю процесс обновления нашего CRM SDK продукта, и основное изменение, с которым я столкнулся, заключается в том, что вместо подключения к службе Xrm и создания моей службы IOrganizationService с использованием проверенных и доверенный метод:Microsoft.Xrm.Tooling.Connector High Memory Allocation

var connection = CrmConnection.Parse(connectionString); 
var service = new OrganizationService(connection); 

Я теперь приходится использовать CrmServiceClient из пространства имен инструментальным:

CrmServiceClient conn = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient(connectionString).OrganizationServiceProxy; 

Теперь это все хорошо, за исключением одного из основной вопрос ... память.

Используя старый метод Xrm.Client, вы смогли указать режим экземпляра службы конфигурации (который по умолчанию использовался для ServiceConfigurationInstanceMode.PerName). Это означает, что служба была повторно использована, если одно и то же приложение называлось create несколько раз. Это уменьшало площадь памяти. На рисунке ниже показано количество выделенной памяти после вызова, чтобы создать экземпляр службы 100 раз

enter image description here

Однако, используя новый метод, вы не можете установить этот режим экземпляра в любом месте и, кажется, совершенно новое соединение создается каждый раз, хотите ли вы этого или нет. Вот результаты того же теста: enter image description here

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

Так что я в основном прошу, я об этом неправильно? Должен ли я сам создавать и кэшировать? Существуют ли скрытые классы/методы, которые мне не хватает? Любая помощь будет принята с благодарностью.

+0

Что такое код/​​установка фулле и что такое новая версия XRM SDK? вы кешируете соединение – lordkain

+0

Единственный уместный код - это то, что я показал выше. Что еще вам нужно? Я не кеширую ничего, поскольку мне никогда не приходилось делать это с помощью способа подключения xrm.client. новый SDK - это версия 8.2.0 Microsoft.CrmSdk.CoreAssemblies (пространство имен показано выше) – doodlleus

+0

Вы ничего не делаете неправильно, так как с 2016 года это новый способ настройки соединений, как я делал в [FakeXrmEasy] (https://github.com/jordimontana82/fake-xrm-easy/blob/master/FakeXrmEasy.Shared/XrmRealContext.cs#L67-L77), поэтому он выглядит как утечка памяти в сборке инструментов. Что делать, если вы сами кэшируете соединение? Любые основные преимущества? – Jordi

ответ

1

Последний SDK (8.2.0.1) кэширует и восстанавливает соединение до тех пор, пока соединительная строка не включает RequireNewInstance=true.

Одна вещь стоит отметить, даже если вы новый вверх другой CrmServiceClient с уникальной строкой подключения (указывая на другую организацию CRM), а в строке соединения не включает RequireNewInstance=true, то CrmServiceClient будет повторно использовать предыдущее соединение в кэше.

Так

var connectionString = [email protected]"Url=https://ORG1.crm.dynamics.com;AuthType=Office365;[email protected];Password=PASSWORD"; 
var connectionString2 = [email protected]"Url=https://ORG2.crm.dynamics.com;AuthType=Office365;[email protected];Password=PASSWORD";  

var crmSvcClient = new CrmServiceClient(connectionString); 
((WhoAmIResponse)crmSvcClient.Execute(new WhoAmIRequest())).OrganizationId.Dump(); 
crmSvcClient.ConnectedOrgFriendlyName.Dump(); 

var crmSvcClient2 = new CrmServiceClient(connectionString2); 
((WhoAmIResponse)crmSvcClient2.Execute(new WhoAmIRequest())).OrganizationId.Dump(); 
crmSvcClient2.ConnectedOrgFriendlyName.Dump(); 

распечатывает и ORG1 GUID дружественное имя оба раза. Если вы пройдете RequireNewInstance=true в connectionstring2, тогда вы увидите распечатку ORG2.