4

Кэширование поведения последнего Dynamics SDK сводит меня с ума.Microsoft Dynamics CRM SDK CRMServiceClient ошибка кэша строки подключения

Во-первых, если вы хотите использовать CrmServiceClient для доступа к различным средам, вам нужно использовать параметр «RequireNewInstance = True»; в строке соединения. Если нет, каждый экземпляр CrmServiceClient будет использовать одно и то же соединение, даже если вы создадите и удалите экземпляры в разные среды.

Теперь, даже если вы используете «RequireNewInstance = True»; в строке подключения я обнаружил, что кеш по-прежнему встречается в некоторых сценариях.

var client1 = new CrmServiceClient(“RequireNewInstance=True; Url= https://myCompany.crm.dynamics.com ; [email protected]; Password=myPassowrd; AuthType=Office365”);

//Now, client 2 points to a url that doesn’t exists: var client2 = new CrmServiceClient("RequireNewInstance=True; Url= https://xxx.crm.dynamics.com ; [email protected]; Password=myPassowrd; AuthType=Office365”);

client2 продолжает использовать первую строку соединения, так что вы не можете определить, если новая строка подключения является правильной.

Любые идеи по правильному подключению строк динамической связи Crm в моем приложении asp.net?

ответ

1

Я думаю, что я нашел эту проблему. Похоже, что это происходит только в онлайн-тестах Dynamics 365, поэтому мы получили непоследовательные результаты в зависимости от среды.

Очевидно, что URL-адрес не должен быть полностью действительным для установления соединения с онлайн-пробной средой CRM, если учетные данные действительны и структура URL-адресов сохраняется.

Давайте рассмотрим следующий пример:

var client1 = new CrmServiceClient(“RequireNewInstance=True; Url= https://fake.crm.dynamics.com ; [email protected]; Password=myPassowrd; AuthType=Office365”);

В этом случае я могу заменить на «фальшивый» часть URL с тем, что я хочу, но по-прежнему выполнять запросы, правильно используя службу CrmServiceClient.

Если я попытаюсь сделать это с другой средой (например, 2015, по предпосылке, не-пробной онлайн-картой и т. Д.), Свойство IsReady CrmServiceClient вернет false, и я получу ошибку в свойстве LastCrmError.

Очень странное поведение, и трудно определить. Теперь, когда я думаю, что понимаю непоследовательное поведение, я знаю, что, наконец, это не повлияет на наших клиентов, поэтому я буду отмечать этот ответ как ответ, даже если я до сих пор не знаю, почему у нас есть другое поведение между пробной и нормальной средой. .

1

Я согласен с выбором повторного использования существующего соединения, если вы не включаете RequireNewInstance=true, кажется контр-интуитивным, но я не могу воспроизвести то, что вы видите. Если я попробую следующее из LinqPad, то crmSvcClient2 выведет ошибки, а затем выбросит нулевой ref на вызов Execute (версия SDK 8.2.0.2). С этой версией SDK вы всегда будете проверять LastCrmError после подключения, чтобы узнать, не произошло ли соединение.

var connectionString = @"AuthType=Office365;Url=https://REAL.crm.dynamics.com;Username=USERNAME;Password=PASSWORD;RequireNewInstance=True;"; 
var connectionString2 = @"AuthType=Office365;Url=https://FAKE.crm.dynamics.com;Username=USERNAME;Password=PASSWORD;RequireNewInstance=True;"; 

using (var crmSvcClient = new CrmServiceClient(connectionString)) 
{ 
    "crmSvcClient".Dump(); 
    crmSvcClient.LastCrmError.Dump(); 
    ((WhoAmIResponse)crmSvcClient.Execute(new WhoAmIRequest())).OrganizationId.Dump(); 
    crmSvcClient.ConnectedOrgFriendlyName.Dump(); 


} 
using (var crmSvcClient2 = new CrmServiceClient(connectionString2)) 
{ 
    "crmSvcClient2".Dump(); 
    crmSvcClient2.LastCrmError.Dump(); 
    ((WhoAmIResponse)crmSvcClient2.Execute(new WhoAmIRequest())).OrganizationId.Dump(); 
    crmSvcClient2.ConnectedOrgFriendlyName.Dump(); 
} 

enter image description here

+0

Благодарим за ответ Matt. Попробуйте использовать ту же строку соединения, но только измените URL-адрес от реального к подделке. То есть, сохраните пользователя и пароль, используемые в crmSvcClient. Вы должны получить поведение, которое я испытываю – Marcos

+0

@Marcos hmmm ... вот что я сделал. Первое соединение было правильным, в то время как второе имеет правильные учетные данные пользователя, но поддельное имя организации. –

+0

Я попробовал еще раз, в разных клиентах, используя x64 и x86 на всякий случай, даже после вашей точно такой же структуры строки соединения, чтобы быть полностью уверенным, и я получаю такое же неправильное поведение.Я даже пытался поместить некоторый рабочий образец на скрипт .net, но я не мог, потому что проблема с зависимостями пакетов. Итак, у вас есть ТОЧНО ТАКОЕ строка подключения, только с разницей URL (например, http://xxx.crm.dynamics.com), первый CrmServiceClient подключается, а второй - нет? – Marcos