热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Web应用程序中连接到CRM的最佳实践

如何解决《在Web应用程序中连接到CRM的最佳实践》经验,为你挑选了1个好方法。

很抱歉,如果这个问题有点广泛,但如果这是关于普通的ASP.NET MVC 5基于Owin的应用程序与MSSQL服务器的默认连接的问题我不会有这么难,但我们使用CRM作为我们的数据库.

好的,我提到我正在研究ASP.NET MVC5应用程序,并且很难找到创建的最佳实践,保持打开并关闭与Dynamics CRM 365的连接?

我发现了很多帖子和博客,但每个人都在他的路上.

有人说每个请求在using语句中打开新连接更好,所以它可以立即关闭(这听起来不错但是请求可能会很慢,因为在每次请求时都需要打开与CRM的新连接).
有人说最好singleton在应用程序范围内创建对象,在应用程序生命周期内保持打开,并在每个请求上重用它.

通常我会用OrganizationServiceProxy一些简单的控制台应用程序,但在这种情况下,我不知道我应该使用OrganizationServiceProxy或者CrmServiceClient还是其他什么东西?

如果有人有或有类似的问题,任何提示都会很棒.

更新:

@Nicknow

我从SDK 365下载了SDK 并使用了这个dll-s.
Microsoft.Xrm.Sdk.dll,Microsoft.Crm.Sdk.Proxy.dll,Microsoft.Xrm.Tooling.Connector.dllMicrosoft.IdentityModel.Clients.ActiveDirectory.dll.

你提到

Microsoft.CrmSdk.XrmTooling.CoreAssembly 8.2.0.5.

如果我正确这个nuget包使用我下载的官方程序集,或者对这个程序包有一些修改?

关于那个测试

验证测试

如果我做对了,无论我是否使用using语句,实现Dispose()方法或只是在应用程序范围内使用静态类一生的应用程序我将总是获得相同的实例(如果我使用默认设置RequireNewInstance=false)?

为了简化代码,我通常会创建一个静态类(也可以使用单例,但通常是矫枉过正)来返回CrmServiceClient对象.这样我的代码就不会出现新的CrmServiceClient调用,我想改变关于如何建立连接的任何内容.

那么在适用于应用程序生命周期的应用程序范围上创建静态类是一个好习惯吗?这意味着发出请求的每个用户都会使用相同的实例?那不是那个连接的性能问题吗?

所有方法调用都将执行完成或抛出异常,因此即使GC需要一段时间没有开放连接,因此会占用资源和/或阻止其他活动.

这个让我回到我总是获得相同实例CrmServiceClient的部分,并得到了xrm.tooling处理缓存连接的部分,但另一方面却发生了什么(Web应用程序).是不是与CRM(即CrmServiceClient)非托管资源的连接,我不应该Dispose()明确吗?

我发现了一些例子有CrmServiceClient,并在所有的例子几乎CrmServiceClient在铸造IOrganizationService使用CrmServiceClient.OrganizationWebProxyClientCrmServiceClient.OrganizationServiceProxy.

为什么会这样,有什么好处呢?

我有很多问题,但这已经分配了问题,是否有任何在线文档可以指向我?



1> Nicknow..:

首先,我假设你使用的是最新的SDK的DLL从的NuGet:Microsoft.CrmSdk.XrmTooling.CoreAssembly 8.2.0.5.

我从来没有在一个using声明中包含连接,我认为我从未见过这样做的例子.在我们拥有工具库之前,有一些来自"旧时代"的例子,其中对create的调用OrganizationServiceProxy被包装在一个using语句中,这导致许多没有经验的开发人员发布具有连接性能问题的代码.

幸运的是,大部分内容都是通过Xrm.Tooling库为我们修复的.

使用CrmServiceClient以下方法创建连接对象

CrmServiceClient crmSvc = new CrmServiceClient(@"...connection string goes here...");

现在,如果我创建一个OrganizationServiceContext(或一个早期绑定的等价物)对象,我using会将其包装成一个,以便在我完成我的工作单元时确定它.

using (var ctx = new OrganizationServiceContext(crmSvc))
{
    var accounts = from a in ctx.CreateQuery("account")
                    select a["name"];

    Console.WriteLine(accounts.ToList().Count());
}

Xrm.Tooling库为连接通道和身份验证处理其他所有内容.除非您指定每次创建新通道(通过向连接字符串添加'RequireNewInstance = true'或在调用时设置useUniqueInstanceto ),否则库将重用现有的经过身份验证的通道.truenew CrmServiceClient

我使用以下代码进行快速验证测试:

void Main()
{

    var sw = new Stopwatch();
    sw.Start();

    var crmSvc = GetCrmClient();

    Console.WriteLine($"Time to get Client # 1: {sw.ElapsedMilliseconds}");

    crmSvc.Execute(new WhoAmIRequest());

    Console.WriteLine($"Time to WhoAmI # 1: {sw.ElapsedMilliseconds}"); 

    var crmSvc2 = GetCrmClient();

    Console.WriteLine($"Time to get Client # 2: {sw.ElapsedMilliseconds}");

    crmSvc2.Execute(new WhoAmIRequest());

    Console.WriteLine($"Time to WhoAmI # 2: {sw.ElapsedMilliseconds}");    

}

public CrmServiceClient GetCrmClient()
{
    return new CrmServiceClient("...connection string goes here...");
}

当我运行它时,RequireNewInstance=true我得到以下控制台输出:

是时候得到客户#1:2216

时间到了WhoAmI#1:2394

是时候得到客户#2:4603

时间到了WhoAmI#2:4780

显然,创建每个连接花费的时间大致相同.

现在,如果我将其更改为RequireNewInstance=false(默认值),我会得到以下内容:

是时候得到客户#1:3761

时间到了WhoAmI#1:3960

是时候得到客户#2:3961

时间到了WhoAmI#2:4145

哇,这是一个很大的区别.到底是怎么回事?在第二次调用时,Xrm.Tooling库使用现有的服务通道和身份验证(缓存它.)

你可以更进一步,将你的new CrmServiceClient调用包装using在一起,你会得到相同的行为,因为处理return instanced不会破坏缓存.

所以这将返回类似于上面的时间:

using (var crmSvc = GetCrmClient())
{
    Console.WriteLine($"Time to get Client # 1: {sw.ElapsedMilliseconds}");

    crmSvc.Execute(new WhoAmIRequest());

    Console.WriteLine($"Time to WhoAmI # 1: {sw.ElapsedMilliseconds}");
}

using (var crmSvc2 = GetCrmClient())
{
    Console.WriteLine($"Time to get Client # 2: {sw.ElapsedMilliseconds}");

    crmSvc2.Execute(new WhoAmIRequest());

    Console.WriteLine($"Time to WhoAmI # 2: {sw.ElapsedMilliseconds}");
}

为了简化代码,我通常会创建一个静态类(也可以使用单例,但通常会过度使用)来返回一个CrmServiceClient对象.这样我的代码就不会乱码,new CrmServiceClient如果我想改变连接的方式.

要从根本上回答这个问题using,我们不需要使用它,因为没有什么可以发布.所有方法调用都将执行完成或抛出异常,因此即使GC需要一段时间没有开放连接,因此会占用资源和/或阻止其他活动.


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • intellij idea的安装与使用(保姆级教程)
    intellijidea的安装与使用(保姆级教程)IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(gi ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
author-avatar
王之玉58_913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有