首页 > 解决方案 > 如何防止 Dynamics 365 在每次建立 CrmServiceClient 连接时进行身份验证

问题描述

我们正在从 Dynamics on-Prem 迁移到 Dynamics 365 online。因此,我们还必须更改连接到 Dynamics 的 web 应用程序。

webapp 仍在工作,但性能很差。我们开始做一些跟踪以了解原因。在此跟踪中,我们看到应用程序正在针对单个请求执行对 Dynamics 的不同在线调用。原因是我们确实在检索不同的数据集。但我们惊讶地发现身份验证也进行了多次。这种身份验证减慢了动态响应。我们期望仅对第一个请求进行身份验证。

我用来建立连接的代码位于一个由其他不同类实例化的抽象类中。此类使用以下属性,从命名空间 Microsoft.Xrm.Tooling.Connector 返回 CrmServiceClient:

     protected CrmServiceClient CustomCrmServiceProxy
    {
        get
        {
            CrmServiceClient client = new CrmServiceClient(CrmConnection.Connectionstring);
            client.CallerId = GetCallerId();

            return client;
        }
    }

连接字符串是 AuthType=ClientSecret;url={0};ClientId={1};ClientSecret={2}; 替换了值。

在使用抽象类的类中,我们将属性称为

var data = this.CustomCrmServiceProxy.RetrieveMultiple("fetch xml");

重要的是我们将 callerid 传递给 CrmServiceClient,当访问者切换到另一种语言的页面时,这个可能会有所不同。

有没有办法防止多重身份验证?实现单例模式是一种选择吗?但是在那种情况下,不同的 callerid 怎么办?CrmServiceClient 是否有一个很好的例子?

标签: c#dynamics-crmdynamics-crm-onlinedynamics-365

解决方案


提供了许多构造函数,CrmServiceClient从而有机会重用连接实例。

例如,下面的构造函数重载有参数useUniqueInstancefalse当应该使用缓存实例时,将值传递给它。

public CrmServiceClient(string userId, SecureString password, string domain, string homeRealm, string hostName, string port, string orgName, bool useUniqueInstance = false, bool useSsl = false, OrganizationDetail orgDetail = null)

然而,在大多数情况下,一个 Web 应用程序将被多个客户端使用,通常是同时使用的,并且单例连接对象在这些情况下无法很好地扩展。在这些情况下,您可以引入连接池

连接池类将负责维护CrmServiceClient实例集合。工厂模式可用于从池对象中声明实例。释放后,工厂实例将所有声明的实例返回到池中。

您的工厂类可以实现现有的IOrganizationServiceFactory. 此界面的设计考虑了模拟要求。

注意:不要让当前使用CrmServiceClient连接的类负责创建这些实例。而是将IOrganizationServiceFactoryorIOrganizationService对象注入到这些类的构造函数中。


推荐阅读