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”);

クライアント2は、新たな接続文字列が正しいかどうかを判断することはできませんので、最初の接続文字列を使用して保持します。

私のasp.netアプリケーションでDynamics Crm接続文字列を正しくテストする方法はありますか?

答えて

1

私は、問題を見つけたと思います。ダイナミクス365のオンライン試験でのみ発生するように思われます。これは、環境によって結果が一貫していないためです。

確かに、資格情報が有効でURL構造が維持されている限り、URLはCRMオンライン試用環境への接続を確立するために完全に有効である必要はありません。

のは、次の例を考えてみましょう:この場合

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

私は私が好きで、URLの「偽」の部分を置き換え、それでもCrmServiceClientサービスを使用して正しく要求を実行することができます。

これを別の環境(2015、敷地内、試用前のcrmオンラインなど)で行うと、CrmServiceClientのIsReadyプロパティがfalseを返し、LastCrmErrorプロパティにエラーが発生します。

非常に奇妙な挙動であり、正確に特定できません。 私は矛盾した動作を理解していると思うので、最終的にはクライアントに影響を及ぼさないので、試行と通常の環境との間で動作が異なる理由はまだ分かりませんが、この応答を回答としてマークします。

1

RequireNewInstance=trueが表示されない場合は、既存の接続を再利用することに同意しますが、表示されている内容を再現することはできません。私がLinqPad crmSvcClient2から次のことを試してみたら、エラーを表示して、Executeコール(SDKの8.2.0.2バージョン)にnull refを投げます。このバージョンの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

マットにお返事ありがとうございます。まったく同じ接続文字列を使用してみてください。実際のURLから偽のURLに変更してください。つまり、crmSvcClientで使用されるユーザーとパスワードを保持します。あなたは私が経験している行動を得なければなりません – Marcos

+0

@Marcos hmmm ...それは私がやったことです。最初の接続は正しいですが、2番目の接続には正しいユーザー資格情報がありますが、偽の組織名があります。 –

+0

私は別のクライアントで、x64とx86を使用してみました。まったく同じ接続文字列構造をたどっていても、完全に間違った動作をします。私はネットフィドルにいくつかの作業サンプルを入れようとしましたが、パッケージの依存関係の問題のためにできませんでした。したがって、URLの違い(例:http://xxx.crm.dynamics.com)だけで、同じ接続文字列があり、最初のCrmServiceClientが接続され、2番目の接続文字列は接続されません。 – Marcos

関連する問題