Разработка
07
Апр
0

Discovery, Metadata, Deployment Services

CrmDiscoveryService

CrmDiscoveryService это новая веб-служба в MS CRM 4.0. Как Вы знаете Microsoft Dynamics CRM 4.0 является мультиарендной средой, т.е. один CRM сервер может содержать множество организации. Соответственно сервер CRM при вызове веб-служб должен знать, в отношении какой организации обрабатывать запрос. Веб-служба CrmDiscoveryService – глобальный сервис инсталляционного уровня, который позволяет вызывающей программе возвратить список организаций, к которым принадлежит указанный пользователь, получить различную информацию о них и узнать URL их конечных точек для CrmService и MetadataService. Также эта Веб-служба используется, чтобы получить билет, который требуется для аутентификация Internet-facing deployment (IFD) и Windows Live.

Рассмотрим небольщой пример: если мы уже знаем название организации и конечные точки (URL) веб-сервисов, то нам нет необходимо использовать CrmDiscoveryService. Если же нет, то мы можем использовать CrmDiscoveryService для того, чтобы конфигурировать CRM Service:

  • Создайте новый плагин и подключите к нему SDK-сборки:
    • Microsoft.Crm.Sdk.dll
    • Microsoft.Crm.SdkTypeProxy.dll
  • Дале нужно добавить в проект ссылку на Discovery Service. Для локальной инсталляции этот веб-сервис имеет следующую конечную точку доступа:
    http://crmservername:port/mscrmservices/2007/AD/CrmDiscoveryService.asmx

    добавьте ее в проект с именем CrmSdk.Discovery;

  • Добавьте в проект цифровую подпись;
  • Далее замените код следующим:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using ClassLibrary8.CrmSdk.Discovery;
    
    namespace ClassLibrary8
    {
        public class DiscoverySampleClass : IPlugin
        {
            public void Execute(IPluginExecutionContext context)
            {
                // Настраиваем DiscoveryService
                CrmDiscoveryService myDiscoveryService = new CrmDiscoveryService();
                CredentialCache credential = new System.Net.CredentialCache();
                NetworkCredential netCred = new NetworkCredential("administrator", "1qaz@WSX", "d2008");
                credential.Add(new Uri("http://mmcrm.ru"), "NTLM", netCred);
                myDiscoveryService.Credentials = credential;
                myDiscoveryService.Url = "http://mmcrm.ru/MSCRMServices/2007/AD/CrmDiscoveryService.asmx";
    
                // Возвращаем список организаций к которым относится пользователь
                RetrieveOrganizationsRequest myRetrieveOrgRequest = new RetrieveOrganizationsRequest();
                RetrieveOrganizationsResponse myRetrieveOrgResponse = (RetrieveOrganizationsResponse)myDiscoveryService.Execute(myRetrieveOrgRequest);
    
                OrganizationDetail myOrgDetail = null;
    
                // Получаем информацию об организации
                foreach (OrganizationDetail orgDetail in myRetrieveOrgResponse.OrganizationDetails)
                {
                    // Если организация superfirma...
                    if (orgDetail.FriendlyName.Equals("superfirma"))
                    {
                        // ... то запоминаем детали организации в объекте myOrgDetail
                        myOrgDetail = orgDetail;
                        break;
                    }
                }
    
                // Настраиваем Crm Authentication Token
                CrmAuthenticationToken myCrmAuthToken = new CrmAuthenticationToken();
                // 0 - AD , 1- IFD , 2 – Windows Live
                myCrmAuthToken.AuthenticationType = 0;
                myCrmAuthToken.OrganizationName = myOrgDetail.OrganizationName;
                // Настраиваем CrmService
                CrmService myCrmService = new CrmService();
                myCrmService.CrmAuthenticationTokenValue = myCrmAuthToken;
                // Передаем в CRM Service валидный URL нужной организации, полученной из Discovery Service
                myCrmService.Url = myOrgDetail.CrmServiceUrl;
    
                // Выводим в сообщении полученный URL
                throw new Exception(myCrmService.Url.ToString());
            }
        }
    }
    

    Этот код по названию организации производит поиск конечной точки для CrmService, а затем настраивает его (для примера URL конченой точки выводится в сообщении);

  • Для тестирования зарегистрируйте плагин в CRM на какое-нибудь событие и вызовите его 🙂




CrmDeploymentService

CrmDeploymentService это также новая служба в CRM 4.0. Используя CrmDeploymentService мы можем делать следующее в отношении организаций:

  • Возвращать;
  • Создавать;
  • Удалять;
  • Отключать;
  • Включать;
  • Обновлять;
  • Устанавливать значения по умолчанию.

Есть два типа объектов развертывания в Microsoft Dynamics CRM: Organization и Server. Deployment SDK обеспечивает программируемый доступ только для управления объектом Organization. Но в настоящее время Вы не сможете написать код в отношении объекта Server, например, для выполнения таких действий, как включение и отключение сервера Microsoft Dynamics CRM.

Для примера, выведем в сообщении тип лицензии, список всех организаций в нашем развертывании MS CRM и отключим одну из них:

  • Для начала Вам необходиом создать как минимум вторую организацию в CRM сервере и узнать ее GUID. Этот GUID Вы можете получить в табличке Organization базы данных MSCRM_CONFIG;
  • Затем создайте новый плагин и подключите к нему SDK-сборки:
    • Microsoft.Crm.Sdk.dll
    • Microsoft.Crm.SdkTypeProxy.dll
  • Дале нужно добавить в проект ссылку на DeploymentService. Конечная точка доступа для этой этот веб-службы:
    http://crmservername:port/mscrmservices/2007/crmdeploymentservice.asmx

    добавьте ее в проект с именем CrmDeploymentSdk;

  • Добавьте в проект цифровую подпись;
  • Далее добавьте в проект такой код:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using ClassLibrary7.CrmDeploymentSdk;
    using System.Net;
    
    namespace ClassLibrary7
    {
        public class Class1 : IPlugin
        {
            public void Execute(IPluginExecutionContext context)
            {
                // Настраиваем Deployment Service
                CrmDeploymentService myDeployService = new CrmDeploymentService();
                CredentialCache credential = new System.Net.CredentialCache();
                NetworkCredential netCred = new NetworkCredential("administrator", "1qaz@WSX", "d2008");
                credential.Add(new Uri("http://win-n22hj23d1b1"), "NTLM", netCred);
                myDeployService.Credentials = credential;
                myDeployService.Url = "http://win-n22hj23d1b1/mscrmservices/2007/crmdeploymentservice.asmx";
    
                // Возвращаем информацию о типе лицензии
                RetrieveLicenseRequest myLicRequest = new RetrieveLicenseRequest();
                RetrieveLicenseResponse myLicResponse = (RetrieveLicenseResponse)myDeployService.Execute(myLicRequest);
                string msg = "License Type: " + myLicResponse.LicenseType.ToString() + "; ";
    
                // Получаем информацию об организации
                RetrieveAllRequest myRetriveAllRequest = new RetrieveAllRequest();
    
                // Только объект Organization поддерживается (другой объект – Server)
                myRetriveAllRequest.EntityName = CrmDeploymentSdk.EntityName.Organization;
                RetrieveAllResponse myRetriveAllResponse = (RetrieveAllResponse)myDeployService.Execute(myRetriveAllRequest);
    
                // Просматриваем все возвращенные организцаии
                foreach (DeploymentEntity myEntity in myRetriveAllResponse.Entities)
                {
                    Organization myOrganization = (Organization)myEntity;
                    msg += "Организация: " + myOrganization.FriendlyName + ", " + myOrganization.Id.ToString() + ", " + myOrganization.UniqueName + ". ";
                }
    
                // Отключаем организцаию
                SetStateOrganizationRequest myOrgSetStateRequest = new SetStateOrganizationRequest();
                myOrgSetStateRequest.EntityName = CrmDeploymentSdk.EntityName.Organization;
                // GUID организации получаем в БД MSCRM_CONFIG, таблица Organization 
                myOrgSetStateRequest.Id = new Guid("6ea12de1-bc2f-df11-bf26-000c29f6b309");
                myOrgSetStateRequest.State = OrganizationState.Disabled;
                SetStateOrganizationResponse myOrgSetStateResponse = (SetStateOrganizationResponse)myDeployService.Execute(myOrgSetStateRequest);
    
                // Выводим тип лицензии и список организаций
                throw new Exception(msg);
            }
        }
    }
    

    Код обращется в Deployment Service — запрашивает тип лицензии и список всех организаций — ложит все это в текстовую переменную и выводит в сообщении. Ну, а напоследок отключает организцаию, GUID которой указан в коде (и который Вам необходимо заменить на свой 🙂 );

  • Для тестирования зарегистрируйте плагин в CRM на какое-нибудь событие и вызовите его 🙂





П.С. Справка по работе с Deployment Service содержится в отдельном Deployment SDK.

MetadataService Web Service

Как и следует из названия, служба MetadataService позволяет Вам программно обращаться к метаданным. Через нее Вы можете запросить параметры различных объектов и их атрибутов, а также производит различные манипуляции с ними (создание/изменение).

Попробуем получить из плагина значения одного пиклиста…

  • Создайте новый плагин и подключите к нему SDK-сборки:
    • Microsoft.Crm.Sdk.dll
    • Microsoft.Crm.SdkTypeProxy.dll
  • Добавить в проект ссылку на Metadata Web Service:
    http://crmservername:port/mscrmservices/2007/metadataservice.asmx

    под именем CrmDeploymentSdk;

  • Добавьте в проект цифровую подпись;
  • В коде напишите следующее:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using ClassLibrary9.MetadataServiceSdk;
    
    namespace ClassLibrary9
    {
        public class Class1 : IPlugin
        {
            public void Execute(IPluginExecutionContext context)
            {
                try
                {
                    // Настраиваем Metadata Service
                    MetadataService metaService = new MetadataService();
                    metaService.Url = "http://mmcrm.ru/mscrmservices/2007/metadataservice.asmx";
                    metaService.UseDefaultCredentials = true;
                    metaService.UnsafeAuthenticatedConnectionSharing = true;
                    MetadataServiceSdk.CrmAuthenticationToken token = new MetadataServiceSdk.CrmAuthenticationToken();
                    token.AuthenticationType = 0;
                    token.OrganizationName = "superfirma"; 
                    metaService.CrmAuthenticationTokenValue = token;
    
                    // Создаем запрос пиклиста accountcategorycode объекта account
                    RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest();
                    attributeRequest.EntityLogicalName = "account";
                    attributeRequest.LogicalName = "accountcategorycode"; //Relationship Type picklist
    
                    // Отправляем запрос в Metadata Service
                    RetrieveAttributeResponse attributeResponse = (RetrieveAttributeResponse)metaService.Execute(attributeRequest);
    
                    // Помещаем возвращенные данные пиклиста в объект picklist
                    PicklistAttributeMetadata picklist = (PicklistAttributeMetadata)attributeResponse.AttributeMetadata;
    
                    // Просматриваем все значения пиклиста и заносим их в переменную
                    string optionList = string.Empty;
                    foreach (Option o in picklist.Options)
                    {
                        optionList += o.Value.Value.ToString() + "=" + o.Label.UserLocLabel.Label.ToString() + ", ";
                    }
    
                    // Выводим значения пиклиста в сообщении
                    throw new Exception(optionList);
                }
                catch (System.Web.Services.Protocols.SoapException ex)
                {
                    throw new Exception(ex.Message + "." + ex.Detail.InnerText);
                } 
            }
        }
    }
    

    Этот код подключается к Metadata Service и запрашивает у него пиклист accountcategorycode. Полученный результат помещаем в объект picklist, просматриваем его значения и помещаем их в строковую переменную. Ну, и наконец выводим ее в сообщении;

  • Для тестирования зарегистрируйте плагин в CRM на какое-нибудь событие и вызовите его 🙂




П.С. С методом Execute веб-службы MetadataService Вы можете использовать следующие сообщения: http://msdn.microsoft.com/en-us/library/cc151148.aspx

Комментарии (0)

*

code