2

Dynamics と統合された ASP.NET MVC アプリケーションに取り組んでいます。プロジェクトは、Dynamics SDK を使用して、挿入または更新されたデータを Dynamics に渡します。これは非常に簡単な統合です。Web サイトのショップ チェックアウト プロセス中にデータを照合し、Dynamics (Dynamics 365 でホストされている) に渡します。Dynamics インスタンスでユーザー アカウントを作成する例を以下に示します。

        public Guid? CreateProfile(IProfile profile)
    {
        using (var xrm = new XrmServiceContext(_crmConnection))
        {
            var crmProfile = new Contact
            {
                EMailAddress1 = profile.Username,
                FirstName = profile.FirstName,
                LastName = profile.LastName,
            };
            xrm.AddObject(crmProfile);
            xrm.SaveChanges();
            return crmProfile.Id;
        }
    }

xrm.SaveChanges() メソッドが完了するまでに最大 20 秒かかる場合があります。Fiddler を使用すると、Dynamics インスタンスへのリクエストが遅くなる原因となる主要な HTTP オーバーヘッドがないことがわかります。これは、Dynamics がリクエストを受け取った後のデータ処理が遅いことを示唆しているようです。

これをスピードアップする方法、または処理に時間がかかる理由について、誰かがポインタ/ヒントを持っていますか? Dynamics が VM で実行されている場合、追加のリソースを追加するだけですが、もちろん、このシナリオではインフラストラクチャを制御できません。

アドバイスをいただければ幸いです。

お時間をいただきありがとうございます

敬具

dotdev

4

1 に答える 1

3

まず、実行中のプラグインまたはリアルタイム ワークフローはありますか? その場合は、それらを無効にして、このパフォーマンスの問題が引き続き発生していることを確認します (つまり、問題はネイティブの CRM にあり、構成やカスタマイズとは関係ありません)。

_crmConnection毎回新しいオブジェクトを作成していますか? もしそうなら、認証トークンをキャッシュしていますか。ここで最も可能性の高い原因は、ADFS とのセキュリティ ハンドシェイクです。20秒はまだ遅いでしょう。私はそれが5秒もかかるのを見てきましたが、平均ははるかに短いです(私の経験では2秒ほどです).

Contactエンティティ作成の簡単なパフォーマンス テストとして、以下を作成しました。Dynamics 365 の試用版で指摘しました。IOrganizationServiceとしてオブジェクトを作成することで、この LINQPad を実行できますconn。これはおそらく、問題を絞り込むのに適した場所です。

// See http://nicknow.net/linqpad-dynamics-crm-sdk/ for a method to create IOrganizationService in LINQPad
IOrganizationService conn = MyExtensions.GetCRMService("Valid CRM Connection String Goes Here");

conn.Execute(new WhoAmIRequest());

var times = new List<long>();

for (int i = 0; i < 25; i++)
{
    var crmProfile = new Entity("contact");

    crmProfile["emailaddress1"] = "test@demo.com.local";
    crmProfile["firstname"] = "test";
    crmProfile["lastname"] = $"test {i}";

    var sw = new Stopwatch();

    sw.Start();
    conn.Create(crmProfile);
    sw.Stop();

    times.Add(sw.ElapsedMilliseconds);
    }

Console.WriteLine($"Total Transactions: {times.Count()} / Average Time: {times.Average()} ms / Max Time: {times.Max()} ms / Min Time: {times.Min()} ms");

次の結果が得られました。

合計トランザクション: 25 / 平均時間: 268.2 ミリ秒 / 最大時間: 714 ミリ秒 / 最小時間: 207 ミリ秒

これは、Fiddler を介して実行されているイメージです。最初のセキュリティ認証と、Organization.svc エンドポイントへの 26 回の呼び出しを確認できます。1 回の呼び出しがありWhoAmIRequest、次に 25回のCreate呼び出しがあります。

パフォーマンス テストのフィドラー

于 2016-12-05T18:04:58.403 に答える