C Sharp kullanarak Azure Time Series Insights 1. Nesil ortamı için başvuru verilerini yönetme
Not
Time Series Insights hizmeti 7 Temmuz 2024'te kullanımdan kaldırılacaktır. Mevcut ortamları mümkün olan en kısa sürede alternatif çözümlere geçirmeyi göz önünde bulundurun. Kullanımdan kaldırma ve geçiş hakkında daha fazla bilgi için belgelerimizi ziyaret edin.
Dikkat
Bu bir 1. Nesil makalesi.
Bu makalede, Azure Time Series Insights 1. Nesil Başvurusu Veri Yönetimi API'sine programlı API istekleri yapmak için C#, MSAL.NET ve Microsoft Entra Id'nin nasıl birleştirildiği gösterilmektedir.
İpucu
GA C# kod örneklerini adresinde https://github.com/Azure-Samples/Azure-Time-Series-Insightsgörüntüleyin.
Özet
Aşağıdaki örnek kod aşağıdaki özellikleri gösterir:
PublicClientApplication MSAL.NET kullanarak erişim belirteci alma.
1. Nesil Başvuru Veri Yönetimi API'sine karşı sıralı CREATE, READ, UPDATE ve DELETE işlemleri.
Yaygın hata kodları da dahil olmak üzere yaygın yanıt kodları.
Başvuru Veri Yönetimi API'si her öğeyi ayrı ayrı işler ve bir öğeyle ilgili bir hata diğerlerinin başarıyla tamamlanmasını engellemez. Örneğin, isteğinizde 100 öğe varsa ve bir öğede hata varsa, 99 öğe yazılır ve bir öğe reddedilir.
Ön koşullar ve kurulum
Örnek kodu derlemeden ve çalıştırmadan önce aşağıdaki adımları tamamlayın:
1. Nesil Azure Time Series Insights ortamı sağlayın.
Ortamınızda bir Başvuru Veri kümesi oluşturun. Aşağıdaki Başvuru Verileri düzenini kullanın:
Anahtar adı Tür uuid String Kimlik doğrulaması ve yetkilendirme bölümünde açıklandığı gibi Microsoft Entra Id için Azure Time Series Insights ortamınızı yapılandırın. Yeniden Yönlendirme URI'sini kullanın
http://localhost:8080/
.Gerekli proje bağımlılıklarını yükleyin.
Her #PLACEHOLDER# değerini uygun ortam tanımlayıcısıyla değiştirerek aşağıdaki örnek kodu düzenleyin.
Projenizin kök dizininde çalıştırın
dotnet run
. İstendiğinde Azure'da oturum açmak için kullanıcı profilinizi kullanın.
Proje bağımlılıkları
Visual Studio'nun en yeni sürümünü kullanmanız ve NETCore.app:
- Visual Studio 2019 - Sürüm 16.4.2+
- NETCore.app - Sürüm 2.2.8
Örnek kodun iki gerekli bağımlılığı vardır:
- Microsoft.Identity.Client - 4.7.1 paketini MSAL.NET.
- Newtonsoft.Json - 12.0.3 paketi.
NuGet 2.12+ kullanarak paketleri ekleyin:
dotnet add package Newtonsoft.Json --version 12.0.3
dotnet add package Microsoft.Identity.Client --version 4.7.1
Veya:
Dosya bildirme
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>
Ardından
dotnet restore
komutunu çalıştırın.
C# örnek kodu
// 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();
}
}
}
Sonraki adımlar
- 1. Nesil Başvuru Veri Yönetimi API başvurusu belgelerini okuyun.