Dynamics CRM 4.0 Web Service SDK 示例






4.41/5 (9投票s)
使用 Dynamics CRM Web 服务查询和创建用户日历。
引言
Microsoft Dynamics CRM 4.0 是一个完整的业务应用程序平台,它开放式地支持定制和扩展,以满足复杂和简单的业务需求。扩展此平台可用功能的一种方式是使用 SDK 并编写代码调用 CRM 标准 Web 服务,以在 CRM 实体上执行查询和更新数据操作等操作。
这个由三部分组成的系列文章解释了一种使用 Dynamics CRM 4.0 Web 服务连接、查询、为具有特定角色的用户(在本例中为销售代表)创建实体记录,然后为该用户创建与其角色相关的用户工作日/工作时间日历的简便方法。
背景
在 Microsoft Dynamics CRM 4.0 中,它不像某些产品那样开箱即用地提供将用户工作日/工作时间日历从一个用户或模板复制/克隆然后粘贴到另一个用户的功能。因此,本文系列中的代码可以帮助开发人员/实施人员解决用户批量创建时,或在创建用户或向现有用户添加角色时需要输入模板/标准属性的棘手任务。
Using the Code
以下步骤陈述了代码策略,该策略将延伸到本文的 3 部分系列:
- 建立与 CRM 服务器实例的连接。
- 获取 CRM 发现 Web 服务实例(通过 Active Directory 进行身份验证)。
- 定位目标组织,然后获取安全令牌并读取 CRM Web 服务的 URL。
- 使用 CRM Web 服务执行查询以获取分配给给定用户的角色。
- 测试该用户是否具有销售代表角色。如果为
true
... - 使用 CRM Web 服务创建用户相关的工作日和工作时间日历,该日历从模板标准用户日历(或内部数据结构)读取。(第二部分)
* 注意:* 稍后,CRM 工作流自定义活动将执行一个系统作业,该作业实现为一个通用的 Windows 命令 Shell 工具,用于调用此控制台应用程序,并传递一个用户登录 * 参数,以便在为用户分配销售代表角色时触发自动创建用户工作日/工作时间日历。(第三部分)。
在开始编写任何基于 Dynamics CRM 4.0 Web 服务的应用程序代码之前,必须在项目解决方案资源管理器中的 Web 引用树分支下设置一个用于使用 Web 服务的 Web 引用。
在本示例中,设置了 2 个 Web 引用;第一个是对 CRM 4.0 平台发布的发现 Web 服务的引用,命名为 CrmSdk.Discovery
,第二个是对 CRM 4.0 CRM Web 服务的 Web 引用,命名为 CrmSdk
。指向这两个 Web 引用的 URL 被格式化为匹配 CRM 4.0 服务器组件的本地 Active Directory 部署。
然后,这两个引用都包含在本示例控制台应用程序项目的命名空间前缀下的 using
程序集声明中。
开始时,我们首先需要传递 2 个命令行参数来设置 CRM 服务器用户名和密码。
if (args.Length != 2)
{
Console.WriteLine( ...);
Return 1;
}
然后,以下代码用于创建/配置 Crm Discovery Service Web Service Proxy 的实例。
注意:Url
属性以硬编码的字符串形式提供以简化操作,但应作为参数传递或从 XML 帮助文件中读取。
CrmDiscoveryService discoveryservice = new CrmDiscoveryService(); discoveryservice.UseDefaultCredentials = true; discoveryservice.Url = ...;
最后,在 Discovery 服务对象实例上调用 Execute
方法,以 RetrieveOrganizationsResponse
CRM 类型检索组织集,然后进行解析,并获取 CRM 服务的 Url
来初始化 CRM Web 服务的对象实例。
RetrieveOrganizationsRequest orgRequest = new RetrieveOrganizationsRequest(); ... RetrieveOrganizationsResponse orgResponse = (RetrieveOrganizationsResponse)discoveryService.Execute(orgRequest); CrmService service = new CrmService(); ...
一旦建立连接并获得 CRM Web 服务的代理,接下来的代码就是标准的查询表达式创建,然后使用 3 个表(在 Role
和 UserRoles
之间,然后在 UserRoles
和 User
表之间进行内连接)检索用户角色,其中 UserRoles
是交叉表。请参阅附带的源代码。
qe = new QueryExpression();
qe.EntityName = "role";
qe.ColumnSet = new AllColumns();
...
LinkEntity le = new LinkEntity();
le.LinkFromEntityName = "role";
le.LinkFromAttributeName = "roleid";
le.LinkToEntityName = "systemuserroles";
le.LinkToAttributeName = "roleid";
// Set up the join between the intersect table "systemuserroles"
// and the "systemuser" entity.
LinkEntity le2 = new LinkEntity();
le2.LinkFromEntityName = "systemuserroles";
le2.LinkFromAttributeName = "systemuserid";
le2.LinkToEntityName = "systemuser";
le2.LinkToAttributeName = "systemuserid";
// The condition is WHERE user ID = myUserId.
ce = new ConditionExpression();
ce.AttributeName = "systemuserid";
ce.Operator = ConditionOperator.Equal;
ce.Values = new object[] { myUserId };
le2.LinkCriteria = new FilterExpression();
le2.LinkCriteria.Conditions = new ConditionExpression[] { ce };
le.LinkEntities = new LinkEntity[] { le2 };
qe.LinkEntities = new LinkEntity[] { le };
// Execute the query.
bec = service.RetrieveMultiple(qe);
...
关注点
在捕获用于检索实体记录和查询 CRM 后端数据库的关键代码路径的异常时,重要的是更新 CRM Web 应用程序的 web.config 文件,将 DevErrors
键的值从 off
改为 on
。这将指示 CRM 运行时在调用 CRM Web 服务时向代码中的 try catch
异常块抛出更有意义的错误消息。
历史
- 本文的第一部分