API планировщика Microsoft возвращает HTTP 500 - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь прочитать все задачи планировщика для одного плана с GraphServiceClient, используя зарегистрированное приложение с разрешениями Group.Read.All и Group.ReadWrite.All на портале azure.

I ' я пытался использовать пакеты Microsoft.Graph и Microsoft.Graph.Beta, но я всегда получаю InternalServerError при вызове любой из конечных точек API планировщика.

Настройка GraphServiceClient с помощью следующего кода

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
             .Create("ClientId")
             .WithTenantId("TenantId")
             .WithClientSecret("ClientSecret")
             .Build();

ClientCredentialProvider clientCredentialProvider = new ClientCredentialProvider(confidentialClientApplication);

GraphServiceClient graphClient = new GraphServiceClient(clientCredentialProvider);

отлично работает. Вызов API группы с

try
{
    Task<IGraphServiceGroupsCollectionPage> groups = graphClient.Groups
        .Request()
        .GetAsync();
    groups.Wait();

    foreach (var item in groups.Result)
    {
        Console.WriteLine(item.DisplayName);
    }
}
catch (Exception e)
{
    Console.WriteLine(e);
}

Также работает. Но вызов API планировщика

try
{
    Task<PlannerPlan> plan = graphClient.Planner.Plans["PlanId"]
        .Request()
        .GetAsync();
    plan.Wait();
    Console.WriteLine(plan.Result.Title);
}
catch (Exception e)
{
    Console.WriteLine(e);
}

только вызывает исключение Ошибка сервера в приложении '/ taskApi'.

Во время выполнения возникло необработанное исключение текущего веб-запроса. Информацию о происхождении и местонахождении исключения можно определить с помощью приведенной ниже трассировки стека исключений.

[NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.]
Microsoft.Office.Tasks.Service .S2SProxies.FederatedGraph.FederatedGraphService.DeserializeFederatedGraphObject (String json) + 35
Microsoft.Office.Tasks.Service.S2SProxies.FederatedGraph.d__51.MoveNext () 31
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) + 60
Microsoft.Office.Tasks.Service.S2SProxies.FederatedGraph.d__47.MoveNext () Ошибка при получении объекта графа]
Microsoft.Office.Tasks.Service.CorrelationSafeAsyn c .ExecuteSynchronously (Func`2 asyncFunction, CancellationToken cancellationToken) + 294
Microsoft.Office.Tasks.Service.UserAccountMagerGountUAU serInfoInternal (утверждение IdentityClaim) + 520

[InvalidOperationException: непредвиденная ошибка при извлечении объекта графа] Microsoft.Office.Tasks.Service.UserAccountManager.AadUserAccountManager.GetExternalUserInfoInternal * Microsoft.fo.Office.Office. Service.UserAccountManager.AadUserAccountManager. 1039 * Microsoft.Office.Tasks.Service.Authentication.AuthenticationModuleBase.HandleAuthenticatedUser (HttpContextBase httpContextBase, IUserAuthentication currentUser) + 168
Microsoft.Office. 1041 * System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutio nStep.Execute () +223 System.Web.HttpApplication.ExecuteStepImpl (шаг IExecutionStep) +213 System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логический и завершенный синхронно) + 91

Mysoft , хотя мне нужно сменить провайдера аутентификации.

Что-нибудь пропущено в моем коде?

РЕДАКТИРОВАТЬ: Рабочий код

Благодаря @ Джим Сюй Я получил свой код работает. Для тех, кто сталкивается с той же проблемой, вот рабочий образец. Мне пришлось добавить клиент, защищающий заголовки всех запросов, но все равно он работает.

IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
.Create("CLientId")
.WithTenantId("TenantId")
.Build();
String[] scopes = new String[] { "Group.Read.All", "Group.ReadWrite.All" };
Func<DeviceCodeResult, Task> deviceCodeReadyCallback = async dcr => await Console.Out.WriteLineAsync(dcr.Message);

DeviceCodeProvider authProvider = new DeviceCodeProvider(publicClientApplication, scopes, deviceCodeReadyCallback);

GraphServiceClient graphClient = new GraphServiceClient(authProvider);
IGraphServiceGroupsCollectionRequest groupRequest = graphClient.Groups.Request();
groupRequest.Headers.Add(new HeaderOption("client_secret", "ClientSecrect"));

Task<IGraphServiceGroupsCollectionPage> groups = groupRequest.GetAsync();
groups.Wait();

foreach (var item in groups.Result)
{
    Console.WriteLine(item.DisplayName);
}

1 Ответ

1 голос
/ 01 мая 2020

Согласно вашему коду вы используете поток учетных данных клиента для вызова Microsoft Plan API. Другими словами, вы используете разрешения приложения для вызова Microsoft Graph Plan API. Это неверно. Согласно официальному документу , мы можем использовать делегированные разрешения для вызова API. Таким образом, вы получите ошибку. enter image description here

Относительно того, как вызывать API с SDK, обратитесь к следующему коду (я тестирую в консольном приложении)

  1. Настройте приложение Azure AD

    a. открыть allowPublicClient настройка enter image description here

    b. обновить разрешения API. Пожалуйста, добавьте требуемые делегированные разрешения: Group.Read.All, Group.ReadWrite.All

  2. Код

  string clientId = "";
            string tenantId = "";
            IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantId)
            .Build();
            var scopes = new string[] { "Group.Read.All", "Group.ReadWrite.All" };
            Func<DeviceCodeResult, Task> deviceCodeReadyCallback = async dcr => await Console.Out.WriteLineAsync(dcr.Message);

            DeviceCodeProvider authProvider = new DeviceCodeProvider(publicClientApplication, scopes, deviceCodeReadyCallback);
            GraphServiceClient graphClient = new GraphServiceClient(authProvider);
            Task<PlannerPlan> plan = graphClient.Planner.Plans["Lc1LT2z1aEqnACVeA8KtIGUABIeE"]
                .Request()
                .GetAsync();
             plan.Wait();
             Console.WriteLine("The plan tiltel : " + plan.Result.Title);
            Console.ReadLine();

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...