Ошибка кэша строки подключения Microsoft Dynamics CRM SDK CRMServiceClient

Кэширование последнего пакета Dynamics SDK сводит меня с ума.

Во-первых, если вы хотите использовать 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");

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

Есть идеи, как правильно тестировать строки соединений Dynamics Crm в моем приложении asp.net?


person Marcos    schedule 27.01.2017    source источник


Ответы (3)


Поздний ответ, но поведение, которое вы видите, связано с тем, что когда вы указываете ошибочный URL-адрес, служба обнаружения используется для определения того, к какому экземпляру подключиться. Чтобы предотвратить это, укажите SkipDiscovery=True в строке подключения:

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

Изменить: SkipDiscovery по умолчанию имеет значение true, начиная с 9.0.7, слава @mwardm

person Marius Agur    schedule 17.10.2018
comment
К вашему сведению: значение SkipDiscovery по умолчанию изменилось с false на true в версиях 9.2.0.5 и 9.2.0.7 XrmTooling DLL. - person mwardm; 27.11.2018
comment
Упс - версии должны были быть 9.0.2.5 и 9.0.2.7. Это был долгий день :-( - person mwardm; 27.11.2018

Я думаю, что нашел проблему. Кажется, это происходит только в онлайн-пробных версиях 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 году, в помещении, непробной версии crm в Интернете и т. д.), свойство IsReady CrmServiceClient вернет значение false, и я получу ошибку в свойстве LastCrmError.

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

person Marcos    schedule 30.01.2017

Я согласен с тем, что выбор повторного использования существующего подключения, если вы не включите RequireNewInstance=true, кажется нелогичным, но я не могу воспроизвести то, что вы видите. Если я попытаюсь сделать следующее из LinqPad, crmSvcClient2 распечатает ошибки, а затем выдаст нулевую ссылку на вызов 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();
}

введите здесь описание изображения

person Matt Dearing    schedule 27.01.2017
comment
Спасибо за ответ, Мэтт. Попробуйте использовать точно такую ​​же строку подключения, но только измените URL-адрес с настоящего на поддельный. То есть сохраните пользователя и пароль, используемые в crmSvcClient. Вы должны получить поведение, которое я испытываю - person Marcos; 27.01.2017
comment
@Маркос Маркос хммм ... это то, что я сделал. Первое соединение было правильным, а второе имеет правильные учетные данные пользователя, но поддельное имя организации. - person Matt Dearing; 27.01.2017
comment
Я попробовал еще раз, в разных клиентах, используя x64 и x86 на всякий случай, даже следуя вашей точно такой же структуре строки подключения, чтобы быть полностью уверенным, и я получаю такое же неправильное поведение. Я даже пытался поместить какой-нибудь рабочий образец в .net fiddle, но не смог из-за проблемы с зависимостями пакетов. Таким образом, у вас ТОЧНО ТА ЖЕ строка подключения, только с разницей в URL (например, xxx.crm.dynamics.com), первый CrmServiceClient подключается, а второй нет ?? - person Marcos; 27.01.2017
comment
@Маркос прав. Используем ли мы одну и ту же версию SDK? - person Matt Dearing; 27.01.2017
comment
Да, я также использую SDK 8.2.0.2. Кажется, я кое-что обнаружил, не могли бы вы рассказать мне вашу онлайн-версию CRM? Кажется, в последней версии (8.2.0.779) он работает неправильно, но в предыдущих версиях (например, 8.1.0.538) работает так, как вы предлагаете. :\ - person Marcos; 27.01.2017
comment
@Marcos Я тестирую CRM версии 8.2.0.779. - person Matt Dearing; 27.01.2017
comment
@Marcos, вы можете попробовать взглянуть на код SDK и либо скомпилировать отладочную версию, в которую вы можете перейти, либо просто посмотреть на нее и посмотреть, как обрабатывается кэширование соединения. Я сделал это несколько недель назад (когда функциональность RequireNewInstance была обновлена), но я не помню, чтобы видел что-то, что могло бы вызвать то, что вы видите. - person Matt Dearing; 27.01.2017
comment
Я не знал, что код доступен. Не могли бы вы указать мне, где скачать исходный код для SDK? - person Marcos; 27.01.2017
comment
@Marcos, кода нет, но вы можете использовать такие инструменты, как Telerik JustDecompile, чтобы взглянуть или создать отладочную версию. - person Matt Dearing; 28.01.2017
comment
Спасибо, я попробую. Теперь я обнаружил, что поведение не связано с подключением к правильному URL-адресу, а затем к неправильному URL-адресу, это просто вопрос среды, к которой подключен (на самом деле я пробовал 4 среды, и я получаю неправильное поведение только в одном). Я возобновлю тесты, вероятно, на следующей неделе и опубликую решение, если я его найду. - person Marcos; 30.01.2017