8. Microsoft Dynamics CRM Web服务与解决方案

Microsoft Dynamics CRM Web服务

Microsoft Dynamics CRM提供了两个重要的Web服务,用于从外部应用程序访问CRM,并调用Web方法来执行常见的业务数据操作,如在CRM中创建,删除,更新和查找。

考虑以下情况:

  • 您有一个外部.NET应用程序需要与CRM交谈。例如,当您的外部应用程序中注册新客户时,您可能需要在CRM中插入联系人记录。
  • 或者,您也可以在CRM中搜索记录,并在外部应用程序中显示搜索结果。

在这种情况下,您可以使用CRM公开的Web服务在应用程序中使用它们,并在CRM中执行创建,删除,更新和查找操作。

IDiscoveryService Web服务

此Web服务返回指定用户所属的组织列表以及每个组织的URL端点。

IOrganizationService Web服务

此Web服务是用于访问CRM中的数据和元数据的主要Web服务。IOrganizationService使用两个重要的程序集 – Microsoft.Xrm.Sdk.dllMicrosoft.Crm.Sdk.Proxy.dll。这些程序集可以在Bin文件夹中的CRM SDK包中找到。

Microsoft.Xrm.Sdk.dll
此程序集定义核心xRM方法和类型,包括代理类,以使与Microsoft Dynamics CRM的连接更简单,身份验证方法和服务合同。

Microsoft.Crm.Sdk.Proxy.dll
此程序集定义非核心消息的请求和响应以及处理组织数据所需的枚举。以下是这两个程序集支持的命名空间。

这些组件中的每一个都支持某些消息,这些消息将用于处理存储在任何实体中的数据。他们支持的完整消息列表可以在这里找到:

支持的xRM消息: https  //msdn.microsoft.com/en-us/library/gg334698.aspx

支持的CRM消息: https  //msdn.microsoft.com/en-us/library/gg309482.aspx

IOrganizationService Web服务方法

IOrganizationService提供了八种方法,使您可以执行对系统和自定义实体的所有常用操作以及组织的元数据。

方法名称 描述
IOrganizationService.Create 创建一个记录。
IOrganizationService.Update 更新现有记录。
IOrganizationService.Retrieve 检索记录。
IOrganizationService.RetrieveMultiple 检索一组记录。
IOrganizationService.Delete 删除记录。
IOrganizationService.Associate 创建记录之间的链接。
IOrganizationService.Disassociate 删除记录之间的链接。
IOrganizationService.Execute 用于常见的记录处理以及案例解析,重复检测等专门处理。

Web Service Example

为了了解Web服务在CRM中的工作情况,我们先看CRM SDK提供的示例。在此示例中,我们将创建一个新的帐户记录,更新它,然后最终使用CRM IOrganizationService Web服务将其删除。

第1步: 打开已解压缩CRM SDK的文件夹。现在,通过浏览到以下位置打开QuickStartCS.sln: SDK\SampleCode\CS\QuickStart

mscrm_web_service_example_step_1

第2步:我们将探索QuickStart Simplified Connection项目。在此项目中打开app.config。默认情况下,该文件中的connectionStrings部分是被注释的。

mscrm_web_service_example_step_2

从此,取消注释第一个连接字符串键并编辑以下三个详细信息:
Url:指定CRM实例的URL。在我们的案例中,由于我们使用在线版本的CRM,您将不得不提到该URL。
用户名:您的CRM Online用户名
密码:您的CRM Online密码

mscrm_web_service_example_step_2_2

步骤3:现在打开该项目中的SimplifiedConnection.cs文件,替换Run方法。

public void Run(StringconnectionString, boolpromptforDelete) {
   try {
      
      // Establish a connection to the organization web service using CrmConnection.
      Microsoft.Xrm.Client.CrmConnection connection = CrmConnection.Parse(connectionString);
      
      // Obtain an organization service proxy.
      // The using statement assures that the service proxy will be properly disposed.
      using(_orgService = new OrganizationService(connection)) {

         //Create any entity records this sample requires.
         CreateRequiredRecords();
         
         // Obtain information about the logged on user from the web service.
         Guid userid = ((WhoAmIResponse)_orgService.Execute(new WhoAmIRequest())).UserId;
         SystemUser systemUser = (SystemUser)_orgService.Retrieve("systemuser",userid,
            new ColumnSet(newstring[]{"firstname","lastname"}));
         
         Console.WriteLine("Logged on user is {0} {1}.", systemUser.FirstName,systemUser.LastName);

         // Retrieve the version of Microsoft Dynamics CRM.
         RetrieveVersionRequest versionRequest = new RetrieveVersionRequest();
         RetrieveVersionResponse versionResponse = (RetrieveVersionResponse)_orgService.Execute(versionRequest);
         Console.WriteLine("Microsoft Dynamics CRM version {0}.",
            versionResponse.Version);
         
         // Instantiate an account object. Note the use of option set enumerations defined in OptionSets.cs.
         
         // Refer to the Entity Metadata topic in the SDK documentation to determine which attributes must
         
         // be set for each entity.
         Account account = new Account{Name = "Fourth Coffee"};
         account.AccountCategoryCode = new OptionSetValue((int)AccountAccountCateg oryCode.PreferredCustomer);
         account.CustomerTypeCode = new OptionSetValue((int)AccountCustomerTypeCod e.Investor);
         
         // Create an account record named Fourth Coffee.
         _accountId = _orgService.Create(account);
         Console.Write("{0} {1} created, ",account.LogicalName,account.Name);
         
         // Retrieve the several attributes from the new account.
         ColumnSet cols = new ColumnSet(new String[]{"name","address1_postalcode","lastusedincampaign"});
         Account retrievedAccount = (Account)_orgService.Retrieve("account", _accountId, cols);
         Console.Write("retrieved, ");

         // Update the postal code attribute.
         retrievedAccount.Address1_PostalCode = "98052";

         // The address 2 postal code was set accidentally, so set it to null.
         retrievedAccount.Address2_PostalCode = null;

         // Shows use of a Money value.
         retrievedAccount.Revenue = new Money(5000000);

         // Shows use of a Boolean value.
         retrievedAccount.CreditOnHold = false;
         
         // Update the account record._orgService.Update(retrievedAccount);
         Console.WriteLine("and updated.");
         
         // Delete any entity records this sample created.
         DeleteRequiredRecords(promptforDelete);
      } 
   } 
   // Catch any service fault exceptions that Microsoft Dynamics CRM throws.
   catch(FaultException) {

      // You can handle an exception here or pass it back to the calling method.
      throw;
   }
}

步骤4:此方法基本上演示了使用CRM Web服务的所有CRUD操作。代码首先创建组织实例,然后创建一个帐户记录,更新创建的记录,然后最终删除它。我们来看看这段代码的重要组成部分。要在此代码运行时查看CRM中的即时更改,您可以逐步调试此代码(如下所述),同时查看CRM中的更改。

步骤4.1:使用在步骤2中修改的连接字符串建立与组织的连接。

Microsoft.Xrm.Client.CrmConnection connection = CrmConnection.Parse(connectionString);

步骤4.2:获取CRM组织Web服务的代理实例。

_orgService = new OrganizationService(connection)

步骤4.3:创建一个新的Account实体对象并设置其Name,AccountCategoryCode和CustomerTypeCode。

Account account = new Account{Name = "Fifth Coffee"}; 
account.AccountCategoryCode = new OptionSetValue((int)AccountAccountCategoryCode.P referredCustomer); 
account.CustomerTypeCode = new OptionSetValue((int)AccountCustomerTypeCode.Investor); 

步骤4.4:使用组织服务的创建方法创建新记录。

_accountId = _orgService.Create(account); 

如果您导航到CRM,您将看到一个新创建的帐户记录。

mscrm_web_service_example_step_4_4

步骤4.5:创建帐户后,服务将使用Retrieve Web Service方法从CRM中回收记录。

ColumnSet cols = new ColumnSet(new String[]{
   "name","address1_postalcode","lastusedincampaign"}); 
Account retrievedAccount = (Account)_orgService.Retrieve("account", _accountId, cols); 

步骤4.6:获取记录后,您可以设置记录的更新值。

retrievedAccount.Address1_PostalCode = "98052"; 
retrievedAccount.Address2_PostalCode = null; 
retrievedAccount.Revenue = new Money(5000000); 
retrievedAccount.CreditOnHold = false; 

步骤4.7:设置记录的更新值后,使用更新 Web服务方法将记录更新回CRM数据库。

_orgService.Update(retrievedAccount); 

如果您在CRM中打开记录,您将看到这些值在那里更新。

mscrm_web_service_example_step_4_7

步骤4.8:最后,使用删除 Web服务方法删除记录。

_orgService.Delete(Account.EntityLogicalName, _accountId); 

如果您现在在CRM中刷新相同的记录,您将看到该记录已被删除后不再可用。

mscrm_web_service_example_step_4_8

结论

在本章中,我们看到了CRM提供的两个重要的Web服务,以及如何从外部应用程序中使用这些Web服务来执行各种CRUD操作的工作示例。

Microsoft Dynamics CRM解决方案

什么是CRM解决方案

解决方案为包装,安装和卸载组件提供了一个框架,以匹配您的业务功能。解决方案允许定制器和开发人员创建,打包和维护扩展CRM的软件单元。您在CRM中执行的任何自定义,扩展或配置都使用解决方案进行打包,管理和分发。解决方案可以从源组织导出为zip文件,然后可以在目标组织中导入。

为了理解这一点,请考虑以下示例场景:

  • 作为开发人员或定制人员,您可以在开发环境中扩展或定制CRM。现在,您要打包更改并将其移动到下一个环境。为此,您可以创建单个解决方案,并在更高的环境中发布。
  • 作为第三方CRM提供商,您已经创建了一个CRM模块,该模块允许使用外部Web服务API管理Microsoft Dynamics CRM实体中的数据。现在你想把这个模块卖给其他客户端。使用解决方案,您可以打包该模块并将其分发给可以安装此解决方案并使用模块提供的功能的其他客户端。

解决方案类型

默认系统解决方案

系统解决方案包含Microsoft Dynamics CRM中定义的即开即用解决方案组件,无需任何自定义。系统解决方案中的许多组件都是可自定义的,可用于托管解决方案或非托管定制。

在本教程中,我们没有创建任何解决方案,并且正在自定义默认的系统解决方案。如果你记得,我们去了设置– > 自定义 – > 自定义系统。此选项直接自定义默认解决方案。

管理解决方案

托管解决方案是一个完成并旨在分发和安装的解决方案。托管解决方案可以安装在系统解决方案或其他托管解决方案之上。

重点:

  • 如果从一个组织导出托管解决方案并将其导入另一个组织,则无法在新组织中编辑解决方案。
  • 托管解决方案不直接引用系统解决方案。
  • 卸载托管解决方案将卸载与解决方案关联的所有自定义项。
  • 默认情况下,无法在目标组织中自定义托管解决方案。但是,使用托管属性的概念,您可以定义解决方案组件是否可自定义,如果是,则可以将解决方案导出为托管解决方案后,组件的哪些特定部分可自定义。

非托管解决方案

非托管解决方案是一种仍在开发中并且不打算分发的解决方案。非托管解决方案包含CRM组件的所有非托管自定义,包括任何添加,修改,删除或删除的组件。默认情况下,任何新解决方案都是非托管解决方案。但是,您可以将非托管解决方案导出为托管或非托管解决方案。

重点:

  • 如果从一个组织导出非托管解决方案并将其导入另一个组织,则可以在新组织中编辑该解决方案。
  • 非托管解决方案直接引用系统解决方案。因此,对一个非托管解决方案所做的更改将应用​​于引用相同组件的所有非托管解决方案,包括系统解决方案。
  • 如果从非托管解决方案中删除解决方案组件,组件将从系统永久删除,将不再可用。如果您只想从特定的非托管解决方案中删除组件,请使用remove而不是delete。
  • 卸载非托管解决方案不会删除关联的自定义。它只是从系统中删除解决方案,但您所做的更改仍将在此。

解决方案组件

可以使用一个解决方案来打包以下组件,这些组件可以使用默认的非管理或管理解决方案进行定制。

组件类型 组件
Schema Entities 实体
Attributes 属性
Relationships
Global Option Sets 全局选项集
User Interface Application Ribbon 应用功能区
SiteMap
Forms
Entity Ribbons 实体功能区
Web Resources 网络资源
Analytics Dashboards 仪表板
Reports
Visualizations 可视化
Process/Code Processes
Dialogs 对话框
Workflows 工作流程
Plugins
Assemblies
Processing Steps 处理步骤
Templates Mail-merge
Email
Contract
Article
Security Security Roles 安全角色
Field Level Security Profiles 现场级安全配置文件

创建解决方案

步骤1:导航到设置 – > 解决方案。点击新建

mscrm_create_solution_step_1

步骤2 – 在随后的窗口中,输入以下详细信息,然后单击“保存并关闭”。

显示名称 – 示例解决方案(可以是您想要的任何名称)。

名称 – 将根据显示名称自动设置。但是,您可以更改此设置。

发布者 – 默认发布者。解决方案发布者提供常见的自定义前缀和选项值前缀。定义解决方案发布者可控制托管解决方案在分发后的更新方式。但是,对于此示例以及大多数一般情况,您可以将其设置为Default Publisher。

版本 – 指定具有以下格式的版本:major.minor.build.revision, 例如: 1.0.0.0.

mscrm_create_solution_step_2

默认情况下,每个解决方案都作为非托管解决方案添加。一旦添加了解决方案,您可以通过在此解决方案的上下文中创建解决方案组件或从其他解决方案添加现有组件来添加解决方案组件。例如,您可以在此新解决方案的上下文中创建新的实体,表单等。

出口解决方案

一旦您将要作为托管或非托管解决方案进行打包的所有更改进行整理,就可以按如下方式导出解决方案。

步骤1:打开源组织并导航到设置 – >解决方案。选择要导出的解决方案,然后单击导出按钮。

mscrm_export_solution_step_1

步骤2: 在“ 发布自定义 ”窗口中,单击“ 发布所有自定义”,然后单击“ 下一步”

mscrm_export_solution_step_2

步骤3:在下面的窗口中,您可以选择任何系统设置,如自动编号,日历设置等,以便与解决方案一起导出。现在,您可以避免选择任何选项,然后单击下一步

mscrm_export_solution_step_3

步骤4:在“ 打包类型 ”窗口中,您可以选择是否要将包导出为受管理或非托管解决方案。对于这个例子,我们将它导出为非托管。单击下一步

mscrm_export_solution_step_4

步骤5:在下一个窗口中,您可以看到您正在使用的CRM的源版本,并可以选择目标版本。单击导出

mscrm_export_solution_step_5

步骤6:单击导出后,该解决方案将导出为zip文件。将此zip文件保存在系统的某个位置。

mscrm_export_solution_step_6

导入解决方案

现在,我们将在上一节导出我们导出的解决方案zip文件到一个新的目标组织。

步骤1:打开目标组织并导航到设置 – > 解决方案。点击导入

mscrm_import_solution_step_1

步骤2:浏览您从导出步骤下载的zip文件,然后单击下一步

mscrm_import_solution_step_2

步骤3:从下一个窗口,您可以根据需要查看解决方案包的详细信息。单击导入将启动解决方案导入过程。

mscrm_import_solution_step_3

步骤4:导入过程完成后,将显示成功或失败的状态。如果进程成功,请单击发布所有自定义。如果解决方案导入失败,它将为您提供详细的错误日志,导入过程的哪个步骤失败。

mscrm_import_solution_step_4

步骤5:我们完成了 该解决方案将成功导入目标组织。点击关闭

解决冲突

由于您可以让多个开发人员负责定制和扩展CRM,因此您将拥有多个托管和非托管解决方案。导出和导入这些解决方案有时会导致冲突情况。例如,假设“解决方案A”在表单上包含一个字段,而“解决方案B”已经删除该字段,“解决方案C”已重命名该字段。在这种情况下,最终的变化是什么?在这种相互冲突的情况下,CRM使用两种方法。

合并:此方法用于用户界面组件,如命令栏,色带和站点地图。根据这种方法,解决方案组件从底部重新计算,组织的非托管定制是最后一个应用。

Top Wins:除了用户界面组件之外,此方法用于所有其他冲突方案。根据这种方法,最后一次更改(被管理或非托管)将获得优先级并被应用。

结论

在本章中,我们介绍了解决方案的概念和不同类型的解决方案及其组件。然后,我们学习了如何创建,导出和导入解决方案。最后,我们研究了当我们有多个受管理和非托管解决方案影响相同解决方案组件时发生的两种冲突解判断略。

Leave a Reply