karasu0825
@karasu0825

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C#でDataverseに接続して操作したい。

解決したいこと

Dataverseにログインしてテーブル情報を取得したいです。
しかし、実装しているDataverse接続用のオブジェクトのインスタンス化で失敗してしまいます。
ログイン情報は今は質問用にマスクしていますが、誤りが無い事は確認しました。。
どうか解決方法のご教示お願い致します。

発生している問題・エラー

CrmServiceClientのインスタンス化に失敗しました。
エラーメッセージ:ERROR REQUESTING Token FROM THE Authentication context
ERROR REQUESTING Token FROM THE Authentication contextCould not load type 'Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential' from assembly 'Microsoft.IdentityModel.Clients.ActiveDirectory, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.Unable to connect to CRM: Could not load type 'Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential' from assembly 'Microsoft.IdentityModel.Clients.ActiveDirectory, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
Could not load type 'Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential' from assembly 'Microsoft.IdentityModel.Clients.ActiveDirectory, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.Unable to Login to Dynamics CRM

該当するソースコード

using System;
using System.Net;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Tooling.Connector;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;
using Microsoft.Xrm.Sdk.WebServiceClient;
using static System.Net.WebRequestMethods;
using System.Configuration;

namespace FetchXMLDemo
{
    class CountProgram
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("開始。");
                //if (args.Length < 3)
                //{
                //    Console.WriteLine("引数:ユーザ名 パスワード URL");
                //    return;
                //}
                string user = "test@test.onmicrosoft.com";
                string password = "test0123";
                string url = "https://test1234.crm7.dynamics.com/";
                var organizationService = CreateCrmService(user, password, url);

                var request = new RetrieveAllEntitiesRequest { EntityFilters = EntityFilters.All };
                var response = (RetrieveAllEntitiesResponse)organizationService.Execute(request);
                foreach (var table in response.EntityMetadata)
                {
                    Console.WriteLine(table.EntitySetName);
                }

                Console.WriteLine("終了。");
            }
            catch (Exception ex)
            {
                // 例外が発生した場合は、ログに出力する
                Console.WriteLine("エラー内容:" + ex);
                // プログラムを終了する
                Environment.Exit(1);
            }
        }
        private static OrganizationWebProxyClient CreateCrmService(string user, string password, string url)
        {
            string authType = "OAuth";
            string appId = "51f81489-12ee-4a9e-aaae-a2591f45987d";
            string reDirectURI = "app://58145B91-0C36-4500-8554-080854F2AC97";
            string loginPrompt = "Auto";
            string ConnectionString = string.Format("AuthType = {0};Username = {1};Password = {2}; Url = {3}; AppId={4}; RedirectUri={5};LoginPrompt={6}",
                                                    authType, user, password, url, appId, reDirectURI, loginPrompt);

            var serviceClient = new CrmServiceClient(ConnectionString);
            // CrmServiceClientのインスタンス化に成功したかどうかを判定する
            if (serviceClient.IsReady)
            {
                // 成功した場合は、OrganizationWebProxyClientプロパティを返す
                var organizationService2 = serviceClient.OrganizationWebProxyClient;
                return organizationService2;
            }
            else
            {
                // 失敗した場合は、エラーメッセージをログに出力し、例外をスローする
                Console.WriteLine("CrmServiceClientのインスタンス化に失敗しました。");
                Console.WriteLine("エラーメッセージ:" + serviceClient.LastCrmError);
                throw new Exception("CrmServiceClientのインスタンス化に失敗しました。");
            }

            //var organizationService = serviceClient.OrganizationWebProxyClient;
            //return organizationService;
        }

    }
}

自分で試したこと

・Microsoft.IdentityModel.Clients.ActiveDirectoryパッケージの再インストール
・ログイン情報の見直し

0

2Answer

エラーメッセージはMicrosoft.IdentityModel.Clients.ActiveDirectory バージョン5.3.0で UserPasswordCredential クラスが見つからないことに関連しているようです。以前のバージョンでは利用可能だったこのクラスが、更新されたバージョンで廃止された可能性があります。
ちなみにこのプログラムはCoreでしょうか? 未確認ですが.Net Coreでサポートされていないかもしれません。

1Like

返信が遅くなり申し訳ありません。
ご回答いただきありがとうございます。
.Net.Coreで作成していたので、.Net.Frameworkで作成しなおしたところ、
正常に動作しました。(ソース修正は無し)
初歩的な事にも関わらず、ご教示いただきありがとうございます。
引き続き学習いたします。

0Like

Your answer might help someone💌