gpt4 book ai didi

c# - Microsoft.Xrm.Tooling.Connector 高内存分配

转载 作者:太空狗 更新时间:2023-10-29 23:43:45 25 4
gpt4 key购买 nike

我目前正在升级我们的产品 CRM SDK,我遇到的主要变化是不再连接到 Xrm 服务并使用以下经过验证且值得信赖的方法创建我的 IOrganizationService:

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

我现在必须使用 Tooling 命名空间中的 CrmServiceClient:

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

现在一切都很好,除了一个主要问题......内存。

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

enter image description here

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

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

所以我基本上要问的是,我是不是用错了方法?我应该自己创建和缓存所有内容吗?我是否缺少隐藏的类/方法?任何帮助将不胜感激。

最佳答案

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

值得注意的一件事是,即使您使用唯一的连接字符串(指向不同的 CRM 组织)新建另一个 CrmServiceClient,但连接字符串不包含 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();

两次打印出 guid 和 ORG1 友好名称。如果您在 connectionstring2 中传递 RequireNewInstance=true,那么您将看到打印出 ORG2。

关于c# - Microsoft.Xrm.Tooling.Connector 高内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40848459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com