Microsoft Graph Batch 요청에서 실패한 요청 식별

11960 단어 batchmicrosoftgraph
Microsoft Graph는 네트워크 왕복을 저장하여 성능을 향상시키는 일괄 요청 기능을 제공합니다.
GET/POST/DELETE와 같은 다양한 유형의 요청이나 Users/Groups/Events 등과 같은 리소스를 포함할 수 있습니다.

이는 유용하지만 요청 유형에 따라 일부 요청이 실패한 이유를 식별하기 어려울 수 있습니다.

예시 시나리오



예를 들어 그룹에서 사용자를 제거하도록 일괄 요청하는 경우 사용자가 그룹에 속하지 않으면 실패합니다. 그러나 오류 메시지는 제거하지 못한 사용자 ID에 대한 정보를 제공하지 않습니다.

요청이 실패했을 때 발생하는 오류입니다.

"error": {
    "code": "Request_ResourceNotFound",
    "message": "Resource 'be24f653-c890-454c-a465-0297c3de2fc2' does not exist or one of its queried reference-property objects are not present.",
    "innerError": {
        "date": "2022-10-03T04:06:29",
        "request-id": "af2627a2-428d-4061-bb3a-00247e8589cc",
        "client-request-id": "e03aab35-0657-c9e2-6703-c38debae955c"
    }
}


이 경우 사용자 ID를 알기 위해서는 실제 요청 자체를 알아야 합니다.

배치의 고유 요청 ID



일괄 요청에 BatchRequestStep 목록을 추가해야 하며 각 BatchRequestStep에는 RequestId 속성이 있습니다. 이 ID는 응답의 일부가 됩니다.

샘플 코드



다음 샘플은 요청뿐만 아니라 응답을 확인하는 방법을 설명합니다. 코드를 단순화하기 위해 두 가지 요청만 추가했지만 더 추가할 수 있습니다. 고유한 요청 ID를 설정할 수 있으므로 여기에서 user id를 사용했으며 콘솔에서 user id로 표시하는 데 사용합니다.

배치 응답의 Key는 요청 ID에 해당합니다.

using Microsoft.Graph;
using Microsoft.Identity.Client;
using System.Net;
using System.Net.Http.Headers;

string tenantId = "tenantId";
string clientId = "clientId";
string clientSecret = "clientSecret";
string baseUrl = "https://graph.microsoft.com/v1.0";
IConfidentialClientApplication app = 
    ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
    .Build();

string[] scopes = new[] { "https://graph.microsoft.com/.default" };

AuthenticationResult authenticationResult = 
    await app.AcquireTokenForClient(scopes).ExecuteAsync();

GraphServiceClient graphClient = new (
    new DelegateAuthenticationProvider(r => {
        r.Headers.Authorization =
            new AuthenticationHeaderValue(
                "bearer", authenticationResult.AccessToken);
        return Task.FromResult(0);
    }));

List<User> users = new();
BatchRequestContent batchRequestContent = new();
string groupId = "the groupId";
string memberId1 = "the memberId1";
batchRequestContent.AddBatchRequestStep(
    new BatchRequestStep(
        memberId1,
        new HttpRequestMessage(
            HttpMethod.Delete,
            $"{baseUrl}/groups/{groupId}/members/{memberId1}/$ref")
        )
    );
string memberId2 = "the memberId2";
batchRequestContent.AddBatchRequestStep(
    new BatchRequestStep(
        memberId2,
        new HttpRequestMessage(
            HttpMethod.Delete,
            $"{baseUrl}/groups/{groupId}/members/{memberId2}/$ref")
        )
    );

BatchResponseContent batchResponseContent = 
    await graphClient.Batch.Request().PostAsync(batchRequestContent);

foreach(KeyValuePair<string, HttpResponseMessage> response 
    in await batchResponseContent.GetResponsesAsync())
{
    if(response.Value.StatusCode != HttpStatusCode.OK)
    {
        BatchRequestStep requestStep = batchRequestContent.BatchRequestSteps[response.Key];
        Console.WriteLine($"StatusCode: {response.Value.StatusCode}");
        Console.WriteLine($"Request URI: {requestStep.Request.RequestUri}");
        Console.WriteLine($"Failed user: {requestStep.RequestId}");
    }
}


요약



Batch는 Microsoft Graph에서 정말 유용한 기능이므로 최대한 활용해 보시기 바랍니다. 배치 요청 단위 테스트를 위해 다른 게시물이 있습니다.

좋은 웹페이지 즐겨찾기