9

Azure Active Directoryへの証明書ベースの認証を使用するためにいくつかの.NETアプリケーションを設定し、次にActive Directoryを使用してSQL Azure DB。永続的なEntity Frameworkコンテキスト内のAzure ADアクセストークンのリフレッシュ

私が問題になっているのは、アプリケーションの一部でDbContextを使用していて、少し長すぎるかもしれないということです。 ADALライブラリは、有効期限の5分以内にアクセストークンを要求した場合、アクセストークンを更新しようとします。問題は、私のDbContextの一部が5分以上生存している可能性があることです。そのため、DbContextの途中でアクセストークンがなくなり、SaveChangesを試行したときにデータベース接続の例外が発生します。

私のDbContextsが5分より短くなるようにリファクタリングする以外に、これを修正するために何かできますか?

私が試したことの1つは、期限切れのアクセストークン例外をキャッチして新しいアクセストークンを持つ新しく作成したものと現在の接続を置き換えることができるEntity Frameworkのフックを見つけることでした。私はEFにカスタム接続ファクトリを渡してから、有効期限が切れたトークン例外が発生したときに実行ストラテジを使用して再試行しました。カスタム実行戦略から現在の接続を変更したり再作成することはできないため、これは私のためには機能しません。

アイデアをいただければ幸いです。

ありがとうございます!

+0

これは悪い考えです。コンテキストは、作業単位のために生きることを意図しています。あなたが同じ文脈で多くの作業単位をやっているように、5分は聞こえます。これにより、文脈であまりにも多くのことをすると、メモリの占有量が多くなりパフォーマンスが低下するなどの問題が発生します。私の推薦はあなたのコードをリファクタリングすることです(この特定の問題にかかわらず) –

+0

あなたは、使用しているEFのバージョンを正確に、またあなたはアイデンティティフレームワークを使っていますか? – GaelSa

+0

アクセストークンをDbContextにどのように渡していますか? DbContextが長く生きていても、潜在的なDbConnectionは長く生きているわけではなく、SQL問合せごとにオープンおよびクローズされます。 –

答えて

2

あなたのコードをリファクタリングするのは確かに最適な選択肢です。

できない場合は、タイマーを4分ごとに起動するように設定できます。このタイマーでDBContextを使用して簡単なクエリを実行します(必要に応じて認証トークンが更新され、SaveChanges )。また、単純なクエリやDBContextを使用したSaveChangesを同時に避けるために、この間にDBContextをロックする必要があります。

関連する問題