Создание сущностей через веб-сервисы случайно завершается с 0x80048405 (доступ запрещен) - PullRequest
1 голос
/ 12 января 2011

У нас есть общедоступный веб-интерфейс ASP.NET, который используется в качестве ограниченного внешнего интерфейса для базового экземпляра CRM4.Связь достигается с помощью веб-службы CRM4 SDK:

var service = new Microsoft.Crm.SdkTypeProxy.CrmService();
service.Credentials = new System.Net.NetworkCredential("user", "pass", "domain");
service.Url = server + "/MSCRMServices/2007/CrmService.asmx";

var token = new CrmAuthenticationToken();
token.OrganizationName = organizationName;
service.CrmAuthenticationTokenValue = token;    
service.PreAuthenticate = true;

Вызов выборки с запросом xml всегда завершается успешно, но иногда происходит сбой при создании сущности:

var entity = new DynamicEntity("some_entity");
var resultGuid = service.Create(entity);

После создания iisreset всегда происходит сбой.Журнал IIS сообщает два запроса POST к CRMservice:

  1. нет пользователя, HTTP 401,5
  2. домен / пользователь, HTTP 500.0

Возврат:

[SoapException: Server was unable to process request.]
   System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) +1769861
   System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) +345
   Microsoft.Crm.SdkTypeProxy.CrmService.Create(BusinessEntity entity) +79

Подробности исключений:

<detail><error>
  <code>0x80048405</code>
  <description>Access is denied.</description>
  <type>Platform</type>
</error></detail>

Все становится странным, когда кто-то создает some_entity вручную, используя собственный пользовательский интерфейс CRM.После этого доступ к веб-сервису работает без проблем.

Дополнительные примечания:

  1. удаление или обновление в собственном интерфейсе CRM НЕ исправляет доступ к веб-сервису
  2. Приложение CRM использует максимум1 рабочий процесс.
  3. Через некоторое время веб-служба снова выходит из строя с "доступом запрещен" (вероятно, перезапись wp)
  4. Ошибки НЕ зависят от данных.
  5. удаление PreAuthenticate didnничего не изменить.
  6. Ничего полезного в журнале событий.

Может ли кто-нибудь помочь мне избавиться от этой странной ошибки, связанной с отказом в доступе?Почему трогательный пользовательский интерфейс CRM меняет поведение веб-службы?

РЕДАКТИРОВАТЬ: Несмотря на то, что Майкл М предоставил обходной путь для ошибки, я все еще не понимаю, почему / как пользовательский интерфейс CRM влияет на аутентификацию CrmService.

1 Ответ

3 голосов
/ 12 января 2011

Возможно, ваш токен неверен. В зависимости от вашего типа аутентификации вам также может понадобиться изменить тип аутентификации токена. Попробуйте следующий способ, чтобы получить экземпляр службы.

private static CrmService GetService(string organization, string server, string domain,
                     string username, string password)
    {
        server = server.TrimEnd(new[] {'/'});

        // Initialize an instance of the CrmDiscoveryService Web service proxy.
        var disco
            = new CrmDiscoveryService
                {
                    Url = String.Format("{0}/MSCRMServices/2007/SPLA/CrmDiscoveryService.asmx", server)
                };

        //Retrieve a list of available organizations.
        var orgResponse =
            (RetrieveOrganizationsResponse) disco.Execute(
                new RetrieveOrganizationsRequest
                    {
                        UserId = domain + "\\" + username,
                        Password = password
                    });

        //Find the desired organization.
        foreach (var orgDetail in orgResponse.OrganizationDetails)
        {
            if (orgDetail.OrganizationName != organization)
                continue;

            //Retrieve the ticket.
            var ticketResponse =
                (RetrieveCrmTicketResponse) disco.Execute(
                    new RetrieveCrmTicketRequest
                        {
                            OrganizationName = organization,
                            UserId = domain + "\\" + username,
                            Password = password
                        });

            //Create the CrmService Web service proxy.
            var token = new CrmAuthenticationToken
                {
                    AuthenticationType = 2,
                    OrganizationName = organization,
                    CrmTicket = ticketResponse.CrmTicket
                };

            return new CrmService
                {
                    CrmAuthenticationTokenValue = token,
                    Url = orgDetail.CrmServiceUrl
                };
        }
        return null;
    }
...