Microsoft Dynamics CRM SDK CRMServiceClient连接字符串缓存错误

时间:2017-01-27 14:33:26

标签: c# dynamics-crm microsoft-dynamics dynamics-crm-online dynamics-crm-365

最后一个Dynamics SDK的缓存行为让我发疯。

首先,如果要使用CrmServiceClient访问不同的环境,则必须在连接字符串中使用参数RequireNewInstance=True;。如果没有,CrmServiceClient的每个实例都将使用相同的连接,即使您创建实例并将其部署到不同的环境。

现在,即使您在连接字符串中使用RequireNewInstance=True;,我发现在某些情况下仍然会出现缓存。

var client1 = new CrmServiceClient("RequireNewInstance=True;
Url=https://myCompany.crm.dynamics.com;
Username=myUser@myCompany.onmicrosoft.com; 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; Username=myUser@myCompany.onmicrosoft.com; 
Password=myPassowrd; AuthType=Office365");

client2继续使用第一个连接字符串,因此您无法确定新连接字符串是否正确。

如何在我的asp.net应用程序中正确测试Dynamics Crm连接字符串?

3 个答案:

答案 0 :(得分:2)

我想我发现了这个问题。它似乎只发生在Dynamics 365在线试验中,这就是我们根据环境得到不一致结果的原因。

显然,只要凭据有效且保留了网址结构,网址就无需完全有效即可建立与CRM在线试用环境的连接。

让我们考虑以下示例:

var client1 = new CrmServiceClient("RequireNewInstance=True; 
Url=https://fake.crm.dynamics.com; 
Username=myUser@myCompany.onmicrosoft.com; Password=myPassowrd; 
AuthType=Office365");

在这种情况下,我可以替换"假的"我想要的任何网址的一部分,但仍使用CrmServiceClient服务正确​​执行请求。

如果我尝试在其他环境中执行此操作(例如2015,内部部署,非审计crm online等),CrmServiceClient的IsReady属性将返回false并且我将在LastCrmError属性中出错。 / p>

非常奇怪的行为,很难精确定位。 现在,我认为我理解不一致的行为,我知道最终它不会影响我们的客户,所以即使我仍然不知道为什么我们在试验和正常环境之间有不同的行为,我会将此响应标记为答案。

答案 1 :(得分:1)

如果您不包含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();
}

enter image description here

答案 2 :(得分:1)

最近的答复,但是您看到的行为是因为当您指定错误的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表示敬意