Я пытаюсь прочитать все задачи планировщика для одного плана с 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);
}