Microsoft.Xrm.Tooling.Connector高内存分配

doo*_*eus 5 c# dynamics-crm dynamics-crm-online dynamics-crm-2016

我目前正在完成升级产品CRM SDK的过程,我遇到的主要变化是使用以下尝试和信任的方法连接到Xrm服务并创建我的IOrganizationService:

var connection = CrmConnection.Parse(connectionString);
var service = new OrganizationService(connection);
Run Code Online (Sandbox Code Playgroud)

我现在不得不使用Tooling命名空间中的CrmServiceClient:

 CrmServiceClient conn = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient(connectionString).OrganizationServiceProxy;
Run Code Online (Sandbox Code Playgroud)

现在这一切都很好,除了一个主要问题......记忆.

使用较旧的Xrm.Client方法,您可以指定服务配置实例模式(默认为ServiceConfigurationInstanceMode.PerName).这意味着如果同一个应用程序多次调用create,则会重用该服务.这使内存占用率降低.下图显示了在调用创建服务实例100次后分配的内存量

在此输入图像描述

但是,使用较新的方法无法在任何地方设置此实例模式,并且无论您是否需要,似乎每次都会创建一个全新的连接.以下是同一测试的结果: 在此输入图像描述

如您所见,每次新连接都会分配越来越多的内存.我无法看到我可以告诉它重用该服务的任何地方.

所以我基本上要问的是,我是以错误的方式解决这个问题吗?我应该自己创建和缓存一切吗?我缺少隐藏的课程/方法吗?任何帮助将不胜感激.

Mat*_*ing 2

只要连接字符串不包含 ,最新的 SDK (8.2.0.1)RequireNewInstance=true就会缓存并重新使用连接。

CrmServiceClient值得注意的一件事是,即使您使用唯一的连接字符串(指向不同的 CRM 组织)新建另一个连接字符串,但该连接字符串不包含RequireNewInstance=trueCrmServiceClient也会重用以前缓存的连接。

所以

var connectionString = $@"Url=https://ORG1.crm.dynamics.com;AuthType=Office365;UserName=USER@DOMAIN.com;Password=PASSWORD";
var connectionString2 = $@"Url=https://ORG2.crm.dynamics.com;AuthType=Office365;UserName=USER@DOMAIN.com;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();
Run Code Online (Sandbox Code Playgroud)

两次打印出 guid 和 ORG1 友好名称。如果你传入RequireNewInstance=trueconnectionstring2你会看到 ORG2 打印出来。