2016-10-25 7 views
0

WCFサービスのためのシステムがあり、クライアントからいくつかの資格情報を取得しています。次に、これらの資格情報を使用してCRMを使用して認証を試みます。認証が失敗した場合は、web.configに資格情報が格納された事前定義されたサービスアカウントを使用します。CRMコンテキストオブジェクトは新しいインスタンスを作成しても接続を維持します

私が見つけたことは、最初のオブジェクトをどれだけ壊しても、使用されている資格情報の最初のセットがそれ以降の要求に対しても持続することです。私は新しいオブジェクトをインスタンス化し、usingステートメントなどの文脈で囲みます。

私は単純な「接続、再試行」ブロックにコードを流し込みましたが、これには同じ問題があります。コードは以下の通りである:

try 
{ 
    var connection = new CrmConnection(); 
    connection.ServiceUri = new Uri("https://my.crm.dynamics.com/"); 
    connection.ClientCredentials = new ClientCredentials(); 
    connection.ClientCredentials.UserName.UserName = "removed1"; 
    connection.ClientCredentials.UserName.Password = "removed1"; 

    using (var crm = new CrmOrganizationServiceContext(connection)) 
    { 
     var req = new Microsoft.Crm.Sdk.Messages.WhoAmIRequest(); 
     var resp = (Microsoft.Crm.Sdk.Messages.WhoAmIResponse)crm.Execute(req); 
    } 
} 

catch (Exception ex) { } 

try 
{ 
    var connection = new CrmConnection(); 
    connection.ServiceUri = new Uri("https://my.crm.dynamics.com/"); 
    connection.ClientCredentials = new ClientCredentials(); 
    connection.ClientCredentials.UserName.UserName = "removed2"; 
    connection.ClientCredentials.UserName.Password = "removed2"; 

    using (var crm = new CrmOrganizationServiceContext(connection)) 
    { 
     var req = new Microsoft.Crm.Sdk.Messages.WhoAmIRequest(); 
     var resp = (Microsoft.Crm.Sdk.Messages.WhoAmIResponse)crm.Execute(req); 
    } 
} 
catch (Exception ex) { } 

removed1が間違っているとremoved2が正しいと仮定します。 2回目の呼び出しでは、無効な資格情報であるトークン例外が発生すると即座に失敗します。 removed1が正しく、removed2でない場合、最初の認証はWhoAmIRequestとなります。次に、removed2は失敗するはずですが、古い資格情報を使用して接続を保持しているように見えます。無効な資格情報によって、依然としてサービスが要求を行うことができます。良くない!

奇妙なことは、認証コードが別のプロジェクトにあることです。私はこのプロジェクトをシンプルなコンソールアプリケーションに組み込みました。すべてうまく動作します。私はこれがWCFサービスとそれが接続を保持する方法と関係があると仮定することができます。私は手作業での処理、ガベージコレクションの呼び出し、ヌルへの設定などを試みました。名前で呼び出されたWeb設定の接続文字列(2つのハードコードされたコード)を試してみました。 CrmConnection.Parse()など

私はコンソールアプリケーションに直接使用しているコードを貼り付けてコピーしても問題ありません。これにより、コード自体ではなく、WCFサービスの動作と関係があると私は確信しています。私は

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

しかし、運の振る舞いを持つようにクラスを設定します。何らかの重要性がある場合、このコードはIDispatchMessageInspectorを実装するメッセージインスペクタクラスで実行されています。

新しいセッションを確保するにはどうすればよいですか?ありがとう。

答えて

0

CrmConnectionクラスのデフォルトコンストラクタを使用しています。そのとき、あなたの接続は名前でキャッシュされます。この名前はConnectionStringSettingsの名前であると考えられますが、このコンストラクタを使用するとそのプロパティは決して設定されず、デフォルト値が保持され、作成された最初の接続オブジェクトが常に返されます。

コンストラクタの別のオーバーロードを使用してください。

CrmConnectionクラスは、データベース接続文字列と同様に、設定ファイルで簡単に接続文字列を作成できるように設計されています。これは、接続文字列を使用するか、サービスURL、それは問題を抱えており、Dynamics CRM 2016 SDKから削除されました。

+0

私は新しいCrmConnection()を 'CrmConnection.Parse(connString)'に置き換え、接続文字列は標準の 'Url = A; User = B; Password = C;'に置き換えました。しかし、同じ問題がまだ発生しています。キャッシュは 'CrmConnection.Parse(str)'を使っても発生しますか?実行時までユーザー名とパスワードがわからないので、名前で接続文字列を呼び出すことはできません。ありがとう。 – plusheen

+0

ちょうど確認するために、2つの完全に異なる接続文字列を使用し、新しい 'CrmConnection'のコンストラクタでそれらを呼んだときに私はあなたに言っていました。それでも同じ問題が発生します。 – plusheen

関連する問題