Verwalten von Referenzdaten für eine Azure Time Series Insights Gen 1-Umgebung mit C Sharp
Anmerkung
Der Time Series Insights-Dienst wird am 7. Juli 2024 eingestellt. Erwägen Sie, vorhandene Umgebungen so schnell wie möglich zu alternativen Lösungen zu migrieren. Weitere Informationen zur Außerbetriebnahme und Migration finden Sie in unserer Dokumentation.
Vorsicht
Dies ist ein Gen1-Artikel.
In diesem Artikel wird gezeigt, wie Sie C#, MSAL.NETund Microsoft Entra-ID kombinieren, um programmgesteuerte API-Anforderungen an die Azure Time Series Insights Gen 1 Referenzdatenverwaltungs-APIzu stellen.
Tipp
Sehen Sie sich die GA C#-Codebeispiele unter https://github.com/Azure-Samples/Azure-Time-Series-Insightsan.
Zusammenfassung
Der folgende Beispielcode veranschaulicht die folgenden Features:
Abrufen eines Zugriffstokens mithilfe MSAL.NETPublicClientApplication.
Sequenzielle CREATE-, READ-, UPDATE- und DELETE-Vorgänge für die Referenzdatenverwaltungs-API.
Allgemeine Antwortcodes, einschließlich allgemeiner Fehlercodes.
Die Referenzdatenverwaltungs-API verarbeitet jedes Element einzeln und ein Fehler mit einem Element verhindert nicht, dass die anderen Elemente erfolgreich abgeschlossen werden. Wenn Ihre Anforderung beispielsweise 100 Elemente enthält und ein Element einen Fehler aufweist, werden 99 Elemente geschrieben und eine abgelehnt.
Voraussetzungen und Einrichtung
Führen Sie die folgenden Schritte aus, bevor Sie den Beispielcode kompilieren und ausführen:
Bereitstellen einer Azure Time Series Insights-Umgebung der Generation 1.
Erstellen Sie einen Referenzdatensatz in Ihrer Umgebung. Verwenden Sie das folgende Referenzdatenschema:
Schlüsselname Typ uuid Schnur Konfigurieren Sie Ihre Azure Time Series Insights-Umgebung für Microsoft Entra-ID, wie in Authentifizierung und Autorisierungbeschrieben. Verwenden Sie
http://localhost:8080/
als -Umleitungs-URI.Installieren Sie die erforderlichen Projektabhängigkeiten.
Bearbeiten Sie den Beispielcode unten, indem Sie jedes #PLACEHOLDER# durch den entsprechenden Umgebungskennzeichner ersetzen.
Führen Sie
dotnet run
im Stammverzeichnis Ihres Projekts aus. Wenn Sie dazu aufgefordert werden, verwenden Sie Ihr Benutzerprofil, um sich bei Azure anzumelden.
Projektabhängigkeiten
Es wird empfohlen, die neueste Version von Visual Studio und NETCore.appzu verwenden:
- Visual Studio 2019 – Version 16.4.2+
- NETCore.app – Version 2.2.8
Der Beispielcode verfügt über zwei erforderliche Abhängigkeiten:
- MSAL.NET Microsoft.Identity.Client- - 4.7.1-Paket.
- Newtonsoft.Json - Paket 12.0.3.
Fügen Sie die Pakete mit NuGet 2.12+hinzu:
dotnet add package Newtonsoft.Json --version 12.0.3
dotnet add package Microsoft.Identity.Client --version 4.7.1
Oder:
Deklariere eine
csharp-tsi-msal-ga-sample.csproj
-Datei:<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.1</TargetFramework> <LangVersion>latest</LangVersion> <RootNamespace>csharp-tsi-msal-ga-sample</RootNamespace> <RunWorkingDirectory>$(MSBuildThisFileDirectory)</RunWorkingDirectory> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Identity.Client" Version="4.7.1.0" Culture="neutral" PublicKeyToken="0a613f4dd989e8ae" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> </ItemGroup> </Project>
Führen Sie dann
dotnet restore
aus.
C#-Beispielcode
// Copyright (c) Microsoft Corporation. All rights reserved.
namespace CsharpTsiMsalGaSample
{
using Microsoft.Identity.Client;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
public static class Program
{
/**
* Review the product documentation for detailed configuration steps or skip ahead and configure your environment settings.
*
* https://learn.microsoft.com/azure/time-series-insights/time-series-insights-authentication-and-authorization
*/
// Azure Time Series Insights environment configuration
internal static string EnvironmentFqdn = "#PLACEHOLDER#.env.timeseries.azure.com";
internal static string EnvironmentReferenceDataSetName = "#PLACEHOLDER#";
// Azure Active Directory application configuration
internal static string AadClientApplicationId = "#PLACEHOLDER#";
internal static string[] AadScopes = new string[] { "https://api.timeseries.azure.com//user_impersonation" };
internal static string AadRedirectUri = "http://localhost:8080/";
internal static string AadTenantName = "#PLACEHOLDER#";
internal static string AadAuthenticationAuthority = "https://login.microsoftonline.com/" + AadTenantName + ".onmicrosoft.com/oauth2/authorize?resource=https://api.timeseries.azure.com/";
private static async Task<string> AcquireAccessTokenAsync()
{
if (AadClientApplicationId == "#PLACEHOLDER#" || AadScopes.Length == 0 || AadRedirectUri == "#PLACEHOLDER#" || AadTenantName.StartsWith("#PLACEHOLDER#"))
{
throw new Exception($"Use the link {"https://learn.microsoft.com/azure/time-series-insights/time-series-insights-get-started"} to update the values of 'AadClientApplicationId', 'AadScopes', 'AadRedirectUri', and 'AadAuthenticationAuthority'.");
}
/**
* MSAL.NET configuration. Review the product documentation for more information about MSAL.NET authentication options.
*
* https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/
*/
IPublicClientApplication app = PublicClientApplicationBuilder
.Create(AadClientApplicationId)
.WithRedirectUri(AadRedirectUri)
.WithAuthority(AadAuthenticationAuthority)
.Build();
AuthenticationResult result = await app
.AcquireTokenInteractive(AadScopes)
.ExecuteAsync();
Console.WriteLine("MSAL Authentication Token Acquired: {0}", result.AccessToken);
Console.WriteLine("");
return result.AccessToken;
}
// System.Net.HttpClient helper to wrap HTTP POST made to the GA Reference Data API
private static async Task<HttpResponseMessage> AsyncHttpPostRequestHelper(HttpClient httpClient, string input)
{
if (EnvironmentFqdn.StartsWith("#PLACEHOLDER#") || EnvironmentReferenceDataSetName == "#PLACEHOLDER#")
{
throw new Exception($"Use the link {"https://learn.microsoft.com/azure/time-series-insights/time-series-insights-authentication-and-authorization"} to update the values of 'EnvironmentFqdn' and 'EnvironmentReferenceDataSetName'.");
}
Console.WriteLine("HTTP JSON Request Body: {0}", input);
Console.WriteLine("");
HttpContent requestBody = new StringContent(input, Encoding.UTF8, "application/json");
Uri uri = new UriBuilder("https", EnvironmentFqdn)
{
Path = $"referencedatasets/{EnvironmentReferenceDataSetName}/$batch",
Query = "api-version=2016-12-12"
}.Uri;
Console.WriteLine("Making HTTP POST to URI: {0}", uri);
Console.WriteLine("");
HttpResponseMessage response = await httpClient.PostAsync(uri, requestBody);
if (response.IsSuccessStatusCode)
{
var jsonString = await response.Content.ReadAsStringAsync();
var jsonStringTransferObject = JsonConvert.DeserializeObject<object>(jsonString);
Console.WriteLine("HTTP JSON Response Body: {0}", jsonStringTransferObject);
Console.WriteLine("");
return response;
}
return null;
}
private static async Task TsiMsalGaSample()
{
Console.WriteLine("Beginning demo...");
Console.WriteLine("");
Console.WriteLine("The following samples assume a single Key Name (uuid) with String type...");
Console.WriteLine("");
string accessToken = await AcquireAccessTokenAsync();
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
{
// CREATE reference data
Console.WriteLine("CREATE reference data example...");
Console.WriteLine("");
string createInput = @"
{
""put"": [
{
""uuid"": ""Fan1""
},
{
""uuid"": ""Fan2"",
""color"": ""White"",
""floor"": 2
},
{
""uuid"": ""Fan3"",
""color"": ""Red"",
""maxSpeed"": 5
}
]
}";
var createResponse = await AsyncHttpPostRequestHelper(httpClient, createInput);
// READ reference data
Console.WriteLine("READ reference data example...");
Console.WriteLine("");
string readInput = @"
{
""get"": [
{
""uuid"": ""Fan1""
},
{
""uuid"": ""Fan2"",
""color"": ""White"",
""desc"": ""example""
},
{
""uuid"": ""Fan3"",
""color"": ""Red"",
""maxSpeed"": 5
}
]
}";
var readResponse = await AsyncHttpPostRequestHelper(httpClient, readInput);
// UPDATE reference data
Console.WriteLine("UPDATE reference data example...");
Console.WriteLine("");
string updateInput = @"
{
""patch"": [
{
""uuid"": ""Fan1"",
""color"": ""Red""
},
{
""uuid"": ""Fan2"",
""color"": ""Orange""
},
{
""uuid"": ""Fan3"",
""desc"": ""Example""
}
]
}";
var inputResponse = await AsyncHttpPostRequestHelper(httpClient, updateInput);
// DELETE reference data
Console.WriteLine("DELETE reference data example...");
Console.WriteLine("");
string deleteInput = @"
{
""delete"": [
{
""uuid"": ""Fan1""
},
{
""uuid"": ""Fan2"",
""color"": ""Orange""
},
{
""uuid"": ""Fan2"",
""desc"": ""Blue""
}
]
}";
var deleteResponse = await AsyncHttpPostRequestHelper(httpClient, deleteInput);
}
}
internal static void Main(string[] args)
{
Task.Run(async () => await TsiMsalGaSample()).Wait();
}
}
}
Nächste Schritte
- Lesen Sie die Referenzdokumentation der Gen 1 Referenzdatenverwaltungs-API.