Microsoft CRM 2011中,包括有两个web service,分别提供了一组方法,通过调用不同的web服务,可以完成不同的功能。
这两个web服务分别是IDiscoveryService web服务以及IOrganization web服务。
IDiscoveryService web服务:一个单独的MS CRM安装中,可以在某台服务器上面部署有多个组织。在存储层角度看,就是一个MS CRM安装,对应一个MSCRM_Config数据库,而每个组织对应一个<组织名称>_MSCRM数据库。如下图所示。
可以看到,有一个MSCRM_Config数据库,而其他的组织相关的数据库包括有Demo_MSCRM等等多个以”_MSCRM”结尾的数据库。
在MSCRM_CONFIG数据库中,存储了不同组织以及该组织对应的数据库。换言之,为了访问业务数据,需要创建sqlConnection实例,那么SqlConnection实例的连接字符串如何确定呢。因为我们知道组织的唯一名称,那么,就可以查询MSCRM_CONFIG数据库,然后,找到相应的连接字符串,赋值给SqlConnection的ConnectionString属性。而后,就可以使用该SqlConnection实例,访问相关组织的数据了。当然,如此直接的访问后台数据表的方式,在MS CRM开发中是不允许的,所以,MS CRM提供了IDiscoveryService服务,使得开发人员可以根据组织的唯一名称以获取该组织的OrganizationService Web服务的Url地址。
IDiscoveryService接口公布的方法是Execute方法,该方法接收的参数为DiscoveryRequest的子类实例。返回的是DiscoveryResponse的子类实例。类树如下图所示。
从上图可见,可以向DiscoveryService提交的请求包括有:
a) RetrieveOrganizationsRequest请求,获取当前MS CRM安装中所有的组织信息。该请求接受的参数为
属性名称 类型 描述 AccessType EndpointAccessType 用于设定需要获取的服务终端点的类型,可选值包括有Default、Internal以及Intranet Release OrganizationRelease 用于设定获取的终端点的版本,可选值包括有Current或者V5 与RetrieveOrganizationsRequest请求对应的响应是RetrieveOrganizationsResponse,该请求中,就一个属性Details,该属性的类型为OrganizationDetailCollection,是一个包含了当前MS CRM部署中,所有组织的详细信息数组,每个组织的详细信息存放在OrganizationDetail的实例中。OrganizationDetail的属性包括有
属性名称 类型 描述 OrganizationId Guid 组织的唯一ID FriendlyName String 组织的友好名称 OrganizationVersion String 组织的版本号 UrlName String OrganizationService服务中,使用的组织名称 UniqueName String 组织的唯一名称 Endpoints EndpointCollection 组织的各个终端点的集合,每个终端点包括有服务的类型以及地址 State OrganizationState 组织的状态,包括有Enabled(已启用)/Disabled(已禁用)两种状态
- b) RetrieveOrganizationRequest请求,用于获取给定唯一名称组织的信息,该请求的接受的参数为:
属性名称 类型 描述 AccessType EndpointAccessType 用于设定需要获取的服务终端点的类型,可选值包括有Default、Internal以及Intranet Release OrganizationRelease 用于设定获取的终端点的版本,可选值包括有Current或者V5 UniqueName String 用于设定组织的唯一名称 - 返回值是RetrieveOrganizationResponse对象,该对象中包含的属性是类型为OrganizationDetail的Detail属性。关于OrganizationDetail类的信息前面已经介绍了,在此不赘述。
- c) RetrieveUserIdByExternalIdRequest请求,用于CRM Live模式下,通过该请求,可以获取与给定Windows Live ID相关的CRM Online用户的ID。
调用IDiscoveryServic的Execute方法的样例代码如下:
1 //实例化RetrieveOrganizationsRequest请求
2 RetrieveOrganizationsRequest orgsRequest = new RetrieveOrganizationsRequest()
3 {
4 AccessType = EndpointAccessType.Default,
5 Release = OrganizationRelease.Current
6 };
7
8 //调用IDiscoveryService的Execute方法,传入RetrieveOrganizationsRequest类型参数,返回RetrieveOrganizationsResponse类型的响应
9 RetrieveOrganizationsResponse organizations = (RetrieveOrganizationsResponse)service.Execute(orgsRequest);
10
11 //枚举当前CRM部署中的所有组织的信息
12 foreach (OrganizationDetail organization in organizations.Details)
13 {
14 Console.WriteLine("Organization Name: {0}", organization.FriendlyName);
15 Console.WriteLine("Unique Name: {0}", organization.UniqueName);
16 Console.WriteLine("Endpoints:");
17 foreach (var endpoint in organization.Endpoints)
18 {
19 Console.WriteLine(" Name: {0}", endpoint.Key);
20 Console.WriteLine(" URL: {0}", endpoint.Value);
21 }
22 }
23
24 //实例化RetrieveOrganizationRequest请求,获取当前部署中,最后一个组织的唯一名称
25 RetrieveOrganizationRequest orgRequest = new RetrieveOrganizationRequest()
26 {
27 UniqueName = organizations.Details[organizations.Details.Count - 1].UniqueName,
28 AccessType = EndpointAccessType.Default,
29 Release = OrganizationRelease.Current
30 };
31
32 //调用IDiscoveryService的Execute方法,获取给定唯一名称组织的信息
33 RetrieveOrganizationResponse org = (RetrieveOrganizationResponse)service.Execute(orgRequest);