Dynamics CRM Online 2015 Update 1 新機能: Web API 開発者プレビュー その 11

みなさん、こんにちは。

前回に引き続き Dynamics CRM Online 2015 Update 1 で提供される
Web API 開発者プレビューを T4 テンプレートで作成したクライアント
で利用する方法について紹介します。連載記事になるため以下の記事を
事前にご覧ください。

Web API 開発者プレビュー その 1
Web API 開発者プレビュー その 2
Web API 開発者プレビュー その 10

今回は前回作成した OData クライアントを利用したプログラムを
作成していきます。

OData クライアントの利用

プロジェクトの作成と準備

まずプロジェクトを準備します。

1. Visual Studio を起動して、新しいプロジェクトを作成します。

2. Visual C# | Windows デスクトップ | コンソールアプリケーション
を選択して、任意の名前を付けます。ここでは WebApiCrmClient と
しました。

image

3. プロジェクトを右クリック | NuGet パッケージの管理を選択します。

4. 左ペインでオンラインを選択して、”odata” で検索します。

5. 検索結果より ”OData Client for .NET” を選択してインストールします。

image

6. 同様に JSON.Net と Active Directory Authentication Library を追加します。

7. Program.cs ファイルを開き、以下の using ステートメントを追加します。

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using WebApiT4Client;

8.  クラスレベルのフィールドとして Main メソッドの前に以下を追加します。
clientId はこちらの記事で取得したものを入力してください。
※serverUrl をご利用の環境にアドレスに変更してください。

#region クラスレベルメンバー

static string serverUrl = "https://<CRM組織名>.crm7.dynamics.com";
static string authUrl = "https://login.windows.net/common";
static string clientId = "取得したIDを入力";
static string redirectUri = "https://localhost/webapipreview";

#endregion クラスレベルメンバー

9. Main メソッドに認証および実行部分とエラーハンドリングのコードを
追加します。

try
{
    AuthenticationContext authContext = new AuthenticationContext(authUrl);
    AuthenticationResult result = authContext.AcquireToken(serverUrl, clientId, new Uri(redirectUri));

    Program app = new Program();
    app.Run(result.AccessToken);
}          
catch (System.Exception ex)
{
    Console.WriteLine("エラーが発生しました。");
    Console.WriteLine(ex.Message);
}
finally
{
    Console.WriteLine("Press <Enter> to exit.");
    Console.ReadLine();

10. 最後に Run メソッドを追加します。

public void Run(string accessToken)
{
    // クライアントの作成
    CrmODataClient client = new CrmODataClient(new Uri(serverUrl + "/api/data/"));
    client.SendingRequest2 += (s, e) => { e.RequestMessage.SetHeader("Authorization", "Bearer " + accessToken); };

}

T4 テンプレートで作成したクライアントの追加

1. プロジェクトを右クリックして、追加 | 既存の項目を選択します。

2. 前回作成した CrmODataClient.cs ファイルを追加します。

image

3. 追加した CrmODataClient.cs を開きます。

4.  18 行目と 24 行目の System を CrmODataClient に変更します。

image

5. ソリューションを一旦ビルドします。

プログラムの実装

まず今回は取引先企業の取得を試します。

1. 上記追加した Run メソッドに以下のコードを追加します。
名前に「サンプル」を含むレコードを取得します。

// 取引先企業の取得
foreach (Account account in client.Accounts.Where(x => x.Name.Contains("サンプル")))
{
    Console.WriteLine("取引先企業名: {0}", account.Name);
}

2. 次に以下のコードを追加します。クエリを外だしにした
形です。

// クエリの作成
var query = from a in client.Accounts
            where a.Name.Contains("サンプル")
            select a;

// クエリの実行
foreach(var account in query)
{
    Console.WriteLine("取引先企業名: {0}", account.Name);
}

動作確認

1. F5 キーを押下してプログラムを実行します。

2. 認証ダイアログが表示されたらログインします。

image

3. 取引先企業の一覧が表示されることを確認します。

image

以下に Program.cs のコードを示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using WebApiT4Client;

namespace WebApiCrmClient
{
    class Program
    {
        #region クラスレベルメンバー

         static string serverUrl = "https://<CRM組織名>.crm7.dynamics.com";
        static string authUrl = "https://login.windows.net/common";
        static string clientId = "取得したIDを入力";
        static string redirectUri = "https://localhost/webapipreview";

         #endregion クラスレベルメンバー

        public void Run(string accessToken)
        {
            // クライアントの作成
            CrmODataClient client = new CrmODataClient(new Uri(serverUrl + "/api/data/"));
            client.SendingRequest2 += (s, e) => { e.RequestMessage.SetHeader("Authorization", "Bearer " + accessToken); };

            // 取引先企業の取得
            foreach (Account account in client.Accounts.Where(x => x.Name.Contains("サンプル")))
            {
                Console.WriteLine("取引先企業名: {0}", account.Name);
            }
           
            // クエリの作成
            var query = from a in client.Accounts
                        where a.Name.Contains("サンプル")
                        select a;

            // クエリの実行
            foreach(var account in query)
            {
                Console.WriteLine("取引先企業名: {0}", account.Name);
            }
        }

        static void Main(string[] args)
        {
            try
            {
                AuthenticationContext authContext = new AuthenticationContext(authUrl);
                AuthenticationResult result = authContext.AcquireToken(serverUrl, clientId, new Uri(redirectUri));

                Program app = new Program();
                //Task.WaitAll(Task.Run(async () => await app.Run(result.AccessToken)));
                app.Run(result.AccessToken);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("エラーが発生しました。");
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Console.WriteLine("Press <Enter> to exit.");
                Console.ReadLine();
            }    
        }
    }
}

まとめ

HttpClient を利用した場合とは随分違う事が分かると思います。
次回はレコードの作成、読み取り、変更、削除を紹介します。
お楽しみに!

- 中村 憲一郎