4

これはベスト プラクティスの質問です。このベスト プラクティスの記事および MSDN によると、OrganizationServiceProxyはスレッド セーフではありません。

OrganizationServiceContext(スレッドごとに) のインスタンスを作成するマルチスレッド クライアント アプリケーションがある場合 、そのコンストラクターはIOrganizationServiceインスタンスを受け入れ、のグローバル インスタンスOrganizationServiceProxy (つまり、一度割り当てられた静的インスタンス)を渡します。 「プロセス レベル」)、これによりスレッド化の問題が発生しますか、および/またはOrganizationServiceProxy インスタンスに障害が発生した場合、スレッドが独自の「ローカル」インスタンスで実行しようとする操作に影響しますOrganizationServiceContextか?

私の考えでは、OrganizationServiceProxyインスタンスは「スレッドごと」に作成OrganizationServiceContextする必要があり、マルチスレッド アプリケーションのそれぞれには、対応する独自の OrganizationServiceProxyインスタンスが必要です。

以上のことを確認したく投稿させていただきました。

また、記事は、

サービス プロキシ クラスは、次のクラス メソッドを使用して、メタデータのダウンロードとユーザー認証を実行します。

IServiceManagement<IOrganizationService> orgServiceManagement =
                 ServiceConfigurationFactory.CreateManagement<IOrganizationService>(
                 new Uri(organizationUrl))

AuthenticationCredentials authCredentials = orgServiceManagement.Authenticate(credentials)

サービス管理オブジェクトと認証済み資格情報オブジェクトをキャッシュすることにより、アプリケーションはアプリケーション セッションごとにサービス プロキシ オブジェクトをより効率的に構築できます。

上記の API 呼び出しを手動で実行しようとすると、Active Directory 認証モードで、MSDN で示されauthCredentials.SecurityTokenResponseているように null になります

ADモードで認証を1回だけ実行し、次のコンストラクターを介して新しく作成された認証済みを渡す方法はありますか? SecurityTokenResponseOrganizationServiceProxy

OrganizationServiceProxy (IServiceConfiguration, SecurityTokenResponse)

OrganizationServiceProxyスレッドごとにインスタンスを構築するときに、「スレッドごとに」認証とメタデータのダウンロード ヒットを取得する必要がなく、ヒットを 1 回だけ取得する必要はありません。

4

1 に答える 1

1

はい、単一の IOrganization サービスでマルチスレッド操作を試みると、間違いなく問題が発生します。

2 つの基本的なマルチスレッド CRM アプリケーション (バッチ プロセッサと別の Web アプリ) があります。バッチ プログラムの場合、10 個の異なるスレッドのみを使用し、10 個の異なるスレッド間で作業をバッチ処理する方がうまく機能することがわかりました。したがって、100,000 レコードを挿入する場合は、それらを 10,000 の 10 バッチに分割し、スレッドごとに 1 つの組織サービスを作成します。

また、多くの CRM インタラクションを行う Web サイトもあるため、リクエストをバッチ処理する実際の方法がないため、CRM 接続プールを作成して、開いている既に認証済みの接続を再利用しました。

もちろん、システム サービス アカウントを使用していない場合、これはまったく機能しません。

于 2012-10-07T03:07:36.310 に答える