c# - 如何防止 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 是否有一个很好的例子?
解决方案
提供了许多构造函数,CrmServiceClient
从而有机会重用连接实例。
例如,下面的构造函数重载有参数useUniqueInstance
。false
当应该使用缓存实例时,将值传递给它。
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
连接的类负责创建这些实例。而是将IOrganizationServiceFactory
orIOrganizationService
对象注入到这些类的构造函数中。
推荐阅读
- python - pyenv 在 MACOS 上安装 python 2.7.8 失败
- laravel-5 - Laravel 5.8 依赖注入 - 如何将模型注入服务
- php - codeigniter 文件上传,两次提交到数据库
- c# - 正则表达式匹配选择 1 个字符太多
- java - 在 Swing 中更改默认 GUI 颜色
- python - django-summernote 附加来自另一个模型/ForeignKey 的图像
- git - mac 超时时 git 的 ssh 配置文件
- python - 将使用 AutoML Tables 创建的 Tensorflow 1 pb 模型转换为 TensorflowJS 以在 NodeJS 中运行
- regex - 当有换行符时,如何在多行上匹配 Golang 正则表达式?
- jenkins - 如何在 Jenkins 全局库中使用 sh