Access Dataverse Web API from .NET Core with Microsoft.PowerPlatform.Dataverse.Client
For applications targeting the full .NET framework the process of connecting to the Dataverse Web API is usually handled by the XrmTooling SDK and the use of connection strings.
For .NET Core applications their is finally (in public preview) an official SDK available providing the same feature set known from Xrm Tooling. This package is intended to work with .NET full framework 4.6.2, 4.7.2 and 4.8, .NET core 3.0, 3.1 and 5.0. Library's source code is available at Github.
In the upcoming sample we will build an application with authentication via client credentials to access the Dataverse Web API.
Application registration in Azure Directory
We assume that you did create an app registration upfront and configured Dynamics impersonation permissions with clientId and client secret. The process is fully documented in docs.microsoft.com.
Create .NET Core Console Application (with Visual Studio Code)
Next step is to create a .NET Core Console App with the required dependency on Microsoft.PowerPlatform.Dataverse.Client.
mkdir "connect-to-dataverse-webapi-with-dataverse-client"
cd "connect-to-dataverse-webapi-with-dataverse-client"
dotnet new console
dotnet add package Microsoft.PowerPlatform.Dataverse.Client
code .
Replace the code in Program.cs with the code below.
Things to note:
- Connection is configured with established pattern of connection strings.
- The library has async/await support.
Edit lines 13-15 by setting clientId and clientSecret.
In line 21 the Dataverse Web API is queried for 10 accounts along with their name.
using Microsoft.PowerPlatform.Dataverse.Client;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace connect_to_dataverse_webapi_with_dataverse_client
{
class Program
{
static async Task Main(string[] args)
{
const string clientId = "<clientId>",
clientSecret = "<clientSecret>",
environment = "<yourEnvironment>.crm4";
var connectionString = @$"Url=https://{environment}.dynamics.com;AuthType=ClientSecret;ClientId={clientId};ClientSecret={clientSecret};RequireNewInstance=true";
using var serviceClient = new ServiceClient(connectionString);
var accountsCollection = await serviceClient.RetrieveMultipleAsync(new QueryExpression("account")
{
ColumnSet = new ColumnSet("name"),
TopCount = 10
});
Console.WriteLine(string.Join("\n",
accountsCollection.Entities
.Select(x => $"{x.GetAttributeValue<string>("name")}, {x.Id}")));
}
}
}
Room for improvement
- Move the auth constants to
app.config
(console) orlocal.settings.json
(Azure Function) file and load the values as environment variables - Better error handling