Создание сущностей через веб-сервисы случайно завершается с 0x80048405 (доступ запрещен)
У нас есть общедоступный веб-интерфейс 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;
Вызов fetch с xml-запросом всегда завершается успешно, но иногда не удается создать сущность:
var entity = new DynamicEntity("some_entity");
var resultGuid = service.Create(entity);
После создания iisreset всегда происходит сбой. Журнал IIS сообщает два запроса POST к CRMservice:
- нет пользователя, HTTP 401.5
- домен / пользователь, 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. После этого доступ к веб-сервису работает без проблем.
Больше примечаний:
- удаление или обновление в собственном пользовательском интерфейсе CRM НЕ исправляет доступ к веб-сервису
- Приложение CRM использует максимум 1 рабочий процесс.
- Через некоторое время веб-сервис снова ломается до "Отказано в доступе" (возможно, переработка wp)
- Ошибки не зависят от данных.
- удаление PreAuthenticate ничего не изменило.
- Ничего полезного в журнале событий.
Может ли кто-нибудь помочь мне избавиться от этой странной ошибки "Отказано в доступе"? Почему трогательный пользовательский интерфейс CRM меняет поведение веб-службы?
РЕДАКТИРОВАТЬ: Несмотря на то, что Майкл М предоставил обходной путь для ошибки, я все еще не понимаю, почему / как пользовательский интерфейс CRM влияет на аутентификацию CrmService.
1 ответ
Возможно, ваш токен неверен. В зависимости от вашего типа аутентификации вам также может понадобиться изменить тип аутентификации токена. Попробуйте следующий метод, чтобы получить экземпляр службы.
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;
}