2016-11-28 60 views
5

我目前通過升級我們的產品CRM SDK和我所遇到的主要變化的過程會是,而不是使用試圖連接到XRM服務和創造我的IOrganizationService和值得信賴的方法:Microsoft.Xrm.Tooling.Connector高內存分配

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

我現在不必從工具命名空間利用CrmServiceClient:

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

現在,這一切只是從一個主要問題......記憶的罰款。

使用你能夠指定服務配置實例模式(默認爲ServiceConfigurationInstanceMode.PerName)舊Xrm.Client方法。這意味着如果同一個應用程序稱爲創建多次,則該服務被重用。這保持了低內存佔用。下面的圖片顯示分配的內存量打電話來創建服務實例100倍

enter image description here

但是之後,使用你不能在任何地方設置這種情況下模式的新方法,它似乎是創建一個全新的連接每一次你是否想要它。下面是相同測試的結果: enter image description here

正如您所看到的,每個新的連接都會分配越來越多的內存。我無法看到任何我可以告訴它重新使用該服務的地方。

那麼我基本上問的是,我在錯誤的方式去這件事?我應該自己創建並緩存一切嗎?是否有隱藏的類/方法,我失蹤了?任何幫助將不勝感激。

+0

是什麼fulle代碼/設置什麼是XRM SDK的新版本?你緩存連接 – lordkain

+0

唯一相關的代碼是我上面顯示的。你還需要什麼?我沒有緩存任何東西,因爲我從來不需要使用xrm.client連接方式來做這件事。較新的SDK是Microsoft.CrmSdk.CoreAssemblies的優化版本8.2.0(命名空間如上圖所示) – doodlleus

+0

你沒有做錯什麼,因爲從2016年是建立連接的新方式就像我在[FakeXrmEasy]在做( https://github.com/jordimontana82/fake-xrm-easy/blob/master/FakeXrmEasy.Shared/XrmRealContext.cs#L67-L77),所以看起來在工具組件內存泄漏。如果你自己緩存連接呢?任何主要的好處? – Jordi

回答

1

只要連接字符串不包含RequireNewInstance=true,最新的SDK (8.2.0.1)緩存並重新連接連接。

有一件事值得一提的是,就算你新再升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(); 

打印出GUID和兩次ORG1友好名稱。如果您通過connectionstring2中的RequireNewInstance=true,那麼您將看到ORG2打印出來。