none
GetCrmService проблема с подключением к CRM RRS feed

  • Вопрос

  • Добрый день, уважаемые эксперты.
    Не можем разобраться с ситуацией по CRM 4.0

    Создается плагин для MS CRM. Web-приложение. Из него происходит попытка
    подключится к Web-службе CRMService.
    Получение СrmService присходит следующим образом

    public static CrmService GetCrmService(string OrgName, string server)
            {
                TimeSheet.CRMService.CrmAuthenticationToken token = new
    TimeSheet.CRMService.CrmAuthenticationToken();
                token.AuthenticationType =
    Microsoft.Crm.Sdk.AuthenticationType.AD;
                token.OrganizationName = OrgName;

                CrmService service = new CrmService();
                service.Credentials =
    System.Net.CredentialCache.DefaultCredentials;
                service.CrmAuthenticationTokenValue = token;
                service.Url = server;

                return service;
            }
          
    Сервис возвращается, все нормально. Далее производится попытка
    обратиться с запросом к сервису

    public static ArrayList GetSheets(CrmService service, string ActivityID)
            {
                try
                {
                    WhoAmIRequest userReq = new WhoAmIRequest();
                    WhoAmIResponse resp =
    (WhoAmIResponse)service.Execute(userReq);

                    QueryExpression qExp = new QueryExpression();
                    QueryByAttribute qByAt = new QueryByAttribute();
                    qByAt.ColumnSet = new AllColumns();
                    qByAt.EntityName = EntityName.task.ToString();
                    if (ActivityID != null)
                    {
                        qByAt.Attributes = new string[] { "ownerid",
    "activityid" };
                        qByAt.Values = new string[] {
    resp.UserId.ToString(), new Guid(ActivityID).ToString() };
                    }
                    else
                    {
                        qByAt.Attributes = new string[] { "ownerid" };
                        qByAt.Values = new string[] { resp.UserId.ToString() };
                    }
                    BusinessEntityCollection arrTasks =
    service.RetrieveMultiple(qByAt);
                  
                    // работа с результатами

                }
                catch (System.Web.Services.Protocols.SoapException ex)
                {
                    return null;
                }
           }

    Падает сразу на WhoAmI запросе с ошибкой 401 Unauthorized
    Перед этим все проверялось в консольном приложении, где подобный
    механизм работал.


    Была попытка так же по найденому на MSDN получить подключение через CRM
    Discovery Service

    public static CrmService IFDConnection(string organization, string
    serverip, string username, string password)
            {
                serverip = serverip.TrimEnd(new char[] { '/' });

                CrmDiscoveryService disco = new CrmDiscoveryService();
                disco.Url = "http://" +serverip +
    "/MSCRMServices/2007/ad/CrmDiscoveryService.asmx";

                RetrieveOrganizationsRequest orgRequest =
                    new RetrieveOrganizationsRequest();
                orgRequest.UserId = username;
                orgRequest.Password = password;
                RetrieveOrganizationsResponse orgResponse =
                    (RetrieveOrganizationsResponse)disco.Execute(orgRequest);

                foreach (OrganizationDetail orgdetail in
    orgResponse.OrganizationDetails)
                {
                    if (orgdetail.OrganizationName == organization)
                    {
                        RetrieveCrmTicketRequest ticketRequest =
                            new RetrieveCrmTicketRequest();
                        ticketRequest.OrganizationName = organization;
                        ticketRequest.UserId = username;
                        ticketRequest.Password = password;
                        RetrieveCrmTicketResponse ticketResponse =
                           
    (RetrieveCrmTicketResponse)disco.Execute(ticketRequest);

                        CrmAuthenticationToken sdktoken = new
    CrmAuthenticationToken();
                        sdktoken.AuthenticationType = 2;
                        sdktoken.OrganizationName = organization;
                        sdktoken.CrmTicket = ticketResponse.CrmTicket;

                        CrmService _CrmService = new CrmService();
                        _CrmService.CrmAuthenticationTokenValue = sdktoken;
                        _CrmService.Url = orgdetail.CrmServiceUrl;

                        string WebApplicationUrl = orgdetail.WebApplicationUrl;
                        Guid OrganizationId = orgdetail.OrganizationId;

                        return _CrmService;
                    }
                }
                return null;
            }
          
    падает на RetrieveOrganizationsResponse orgResponse =
    (RetrieveOrganizationsResponse)disco.Execute(orgRequest); с той же 401
    ошибкой.
    Пользователь указан с доменом.

    Подскажите, пожалуйста, что делаем не так?
    25 декабря 2009 г. 9:51

Ответы

  • Странно, потому что код на первый взгляд правильный.

    Судя по всему в плагин добавили вебреференс на сервис CRM. Почему не пользуетесь стандартными SDK сборками. Гораздо проще экземпляр сервиса в теле плагина создать так:

    ICrmService crmservice = context.CreateCrmService(true);
    Truth is opened the prepared mind My blog - http://a33ik.blogspot.com
    25 декабря 2009 г. 10:12