Administración de datos de referencia para un entorno de Azure Time Series Insights Gen 1 mediante C Sharp
Nota
El servicio Time Series Insights se retirará el 7 de julio de 2024. Considere la posibilidad de migrar entornos existentes a soluciones alternativas lo antes posible. Para obtener más información sobre la obsolescencia y la migración, visite la documentación .
Cautela
Este es un artículo de Gen1.
En este artículo se muestra cómo combinar C#, MSAL.NETy Id. de Microsoft Entra para realizar solicitudes de API mediante programación a Azure Time Series Insights Gen 1 Reference Data Management API.
Propina
Vea los ejemplos de código de C# en GA en https://github.com/Azure-Samples/Azure-Time-Series-Insights.
Resumen
En el código de ejemplo siguiente se muestran las siguientes características:
Adquirir un token de acceso usando MSAL.NETPublicClientApplication.
Operaciones secuenciales de creación, lectura, actualización y eliminación en la API de gestión de datos de referencia Gen 1 .
Códigos de respuesta comunes, incluidos códigos de error comunes.
Reference Data Management API procesa cada elemento individualmente y un error con un elemento no impide que los demás se completen correctamente. Por ejemplo, si la solicitud tiene 100 elementos y un elemento tiene un error, se escriben 99 elementos y se rechaza uno.
Requisitos previos y configuración
Complete los pasos siguientes antes de compilar y ejecutar el código de ejemplo:
aprovisionar un entorno de de Azure Time Series Insights gen 1.
Crear un conjunto de datos de referencia dentro de su entorno. Use el siguiente esquema de datos de referencia:
Nombre de clave Tipo identificador único universal (UUID) Cuerda Configure el entorno de Azure Time Series Insights para Microsoft Entra ID tal como se describe en autenticación y autorización. Usa
http://localhost:8080/
como URI de redirección.Instale las dependencias de proyecto necesarias.
Edite el código de ejemplo siguiente reemplazando cada de
#PLACEHOLDER# por el identificador de entorno adecuado. Ejecute
dotnet run
en el directorio raíz del proyecto. Cuando se le solicite, use el perfil de usuario para iniciar sesión en Azure.
Dependencias del proyecto
Se recomienda usar la versión más reciente de Visual Studio y NETCore.app:
- visual Studio 2019: versión 16.4.2+
- NETCore.app: versión 2.2.8
El código de ejemplo tiene dos dependencias necesarias:
- MSAL.NET Microsoft.Identity.Client - paquete 4.7.1.
- paquete Newtonsoft.Json - 12.0.3.
Agregue los paquetes mediante nuGet 2.12+ :
dotnet add package Newtonsoft.Json --version 12.0.3
dotnet add package Microsoft.Identity.Client --version 4.7.1
O:
Declare un archivo
csharp-tsi-msal-ga-sample.csproj
:<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>
A continuación, ejecute
dotnet restore
.
Código de ejemplo de 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();
}
}
}