Zarządzanie danymi referencyjnymi dla środowiska usługi Azure Time Series Insights Gen 1 przy użyciu języka C Sharp
Uwaga
Usługa Time Series Insights zostanie wycofana 7 lipca 2024 r. Rozważ migrację istniejących środowisk do alternatywnych rozwiązań tak szybko, jak to możliwe. Aby uzyskać więcej informacji na temat wycofywania i migracji, odwiedź naszą dokumentację.
Uwaga
Jest to artykuł z generacji 1.
W tym artykule pokazano, jak połączyć język C#, MSAL.NET i identyfikator Entra firmy Microsoft w celu programowania żądań interfejsu API do interfejsu API referencyjnego Zarządzanie danymi usługi Azure Time Series Insights Gen 1 .
Napiwek
Wyświetl przykłady kodu ogólnie dostępnego w języku C# na stronie https://github.com/Azure-Samples/Azure-Time-Series-Insights.
Podsumowanie
Poniższy przykładowy kod przedstawia następujące funkcje:
Uzyskiwanie tokenu dostępu przy użyciu MSAL.NET PublicClientApplication.
Sekwencyjne operacje CREATE, READ, UPDATE i DELETE względem interfejsu API Zarządzanie danymi odwołań 1. generacji.
Typowe kody odpowiedzi, w tym typowe kody błędów.
Interfejs API odwołania Zarządzanie danymi przetwarza poszczególne elementy indywidualnie, a błąd z jednym elementem nie uniemożliwia pomyślnego ukończenia pozostałych elementów. Jeśli na przykład żądanie zawiera 100 elementów, a jeden element zawiera błąd, 99 elementów jest zapisywanych i jeden jest odrzucany.
Wymagania wstępne i konfiguracja
Przed skompilem i uruchomieniem przykładowego kodu wykonaj następujące kroki:
Aprowizuj środowisko usługi Azure Time Series Insights 1. generacji.
Utwórz zestaw danych referencyjnych w danym środowisku. Użyj następującego schematu danych referencyjnych:
Nazwa klucza Typ uuid String Skonfiguruj środowisko usługi Azure Time Series Insights dla identyfikatora Entra firmy Microsoft zgodnie z opisem w temacie Uwierzytelnianie i autoryzacja. Użyj
http://localhost:8080/
jako identyfikatora URI przekierowania.Zainstaluj wymagane zależności projektu.
Zmodyfikuj poniższy przykładowy kod, zastępując każdy #PLACEHOLDER# odpowiednim identyfikatorem środowiska.
Uruchom polecenie
dotnet run
w katalogu głównym projektu. Po wyświetleniu monitu użyj profilu użytkownika, aby zalogować się do platformy Azure.
Zależności projektu
Zaleca się używanie najnowszej wersji programu Visual Studio i NETCore.app:
- Visual Studio 2019 — wersja 16.4.2 lub nowsza
- NETCore.app — wersja 2.2.8
Przykładowy kod ma dwie wymagane zależności:
- MSAL.NET Microsoft.Identity.Client — pakiet 4.7.1.
- Newtonsoft.Json — pakiet 12.0.3.
Dodaj pakiety przy użyciu pakietu NuGet 2.12+:
dotnet add package Newtonsoft.Json --version 12.0.3
dotnet add package Microsoft.Identity.Client --version 4.7.1
Lub:
Zadeklaruj
csharp-tsi-msal-ga-sample.csproj
plik:<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>
Następnie należy uruchomić polecenie
dotnet restore
.
Przykładowy kod w języku C#
// 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();
}
}
}
Następne kroki
- Przeczytaj dokumentację referencyjną interfejsu API Zarządzanie danymi. generacji.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla