Hoofdstuk 2: Azure Backend Setup
De hersenen van de operatie. We gebruiken een Azure Function (.NET Isolated) om het Project bestand te verwerken.
2.1 App Registration (Identiteit)
- Ga naar portal.azure.com -> Entra ID (voorheen Azure AD).
- Klik op App registrations -> New registration.
- Naam:
AppReg-ProjectImport-DEV. Klik Register. - Kopieer de Application (client) ID (bewaar deze!).
- Ga naar Certificates & secrets -> New client secret -> Kopieer de Value (bewaar deze!).
- Ga naar API Permissions -> Add permission -> Dynamics CRM -> user_impersonation.
Cruciaal: Admin Consent
Je moet op de knop "Grant admin consent for [Org]" klikken in het API Permissions scherm. Zonder dit vinkje werkt de login niet!
2.2 De Code (.NET Isolated)
We gebruiken drie bestanden. Vervang de inhoud in VS Code met onderstaande code.
Bestand 1: Program.cs
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices(services => { })
.Build();
host.Run();
Bestand 2: DataverseAuthenticator.cs
using System;
using Microsoft.PowerPlatform.Dataverse.Client;
namespace BWPP.ImportTool
{
public static class DataverseAuthenticator
{
public static ServiceClient GetServiceClient()
{
// Vul hier je gegevens in (of gebruik Environment Variables voor Prod)
string clientId = "JOUW_CLIENT_ID";
string clientSecret = "JOUW_CLIENT_SECRET";
string environment = "https://JOUW_ORG.crm4.dynamics.com/";
string connectionString = $@"AuthType=ClientSecret;Url={environment};ClientId={clientId};ClientSecret={clientSecret}";
return new ServiceClient(connectionString);
}
}
}
Bestand 3: AnalyzeProjectFile.cs
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.PowerPlatform.Dataverse.Client;
using Microsoft.Xrm.Sdk;
namespace BWPP.ImportTool
{
public class AnalyzeProjectFile
{
private readonly ILogger _logger;
public AnalyzeProjectFile(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger();
}
[Function("AnalyzeProjectFile")]
public async Task Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
{
_logger.LogInformation("Processing request...");
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
string fileName = data?.name;
string fileContentBase64 = data?.contentBytes;
var response = req.CreateResponse(HttpStatusCode.OK);
ServiceClient service = DataverseAuthenticator.GetServiceClient();
if (!service.IsReady) {
var err = req.CreateResponse(HttpStatusCode.InternalServerError);
await err.WriteStringAsync($"Dataverse fout: {service.LastError}");
return err;
}
try {
Entity project = new Entity("msdyn_project");
project["subject"] = $"Import: {fileName}";
project["msdyn_scheduledstart"] = DateTime.Now;
Guid projectId = service.Create(project);
await response.WriteStringAsync(JsonConvert.SerializeObject(new { scanresult = $"Project aangemaakt: {projectId}" }));
return response;
}
catch (Exception ex) {
var err = req.CreateResponse(HttpStatusCode.InternalServerError);
await err.WriteStringAsync($"Error: {ex.Message}");
return err;
}
}
}
}