在 C# 的 ASP.NET Web API 中使用 Microsoft Graph API 创建 MS Teams 会议时出错

问题描述 投票:0回答:1

我目前正在开发一个 ASP.NET Web API,它将支持创建 Teams 会议和检索连接 URL。我遵循了微软的文档,但它似乎不完整,并且我遇到了很多错误。

我在 Azure 中添加了具有 API 权限的应用程序注册

OnlineMeetings.ReadWrite.All
。我应该能够在不使用通用帐户的情况下同时创建多个链接。我只是想授权我的资源创建会议。

var tenantId = "...";
var clientId = "...";
var clientSecret = "...";

var options = new TokenCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);

var graphClient = new GraphServiceClient(clientSecretCredential);

var requestBody = new Microsoft.Graph.Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetPostRequestBody
{
    StartDateTime = DateTimeOffset.Parse("2024-02-20T14:30:00.2444915-07:00"),
    EndDateTime = DateTimeOffset.Parse("2024-02-20T15:00:00.2464912-07:00"),
    Subject = "Test meeting from graph API",
    Participants = new MeetingParticipants
    {
        Organizer = new MeetingParticipantInfo
        {
            Identity = new IdentitySet
            {
                User = new Identity
                {
                    Id = "[email protected]"
                }
            },
            Upn = "[email protected]"
        },
        Attendees = new List<MeetingParticipantInfo>
        {
            new MeetingParticipantInfo
            {
                Identity = new IdentitySet
                {
                    User = new Identity
                    {
                        Id = "[email protected]"
                    }
                },
                Upn = "[email protected]"
            }
        }
    }
};

var result = await graphClient.Users["[email protected]"].OnlineMeetings.CreateOrGet.PostAsync(requestBody);
return result.JoinWebUrl;

使用 Azure 中的指定凭据执行此代码时,我收到此错误:

Microsoft.Graph.Models.ODataErrors.ODataError

带有 http 404 错误代码

这个异常最初是在这个调用堆栈上抛出的:

Library.Http.HttpClientRequestAdapter.ThrowIfFailedResponse(System.Net.Http.HttpResponseMessage,System.Collections.Generic.Dictionary>,System.Diagnostics.Activity,System.Threading.CancellationToken)
Library.Http.HttpClientRequestAdapter.SendAsync(Library.Abstractions.RequestInformation,Library.Abstractions.Serialization.ParsableFactory,System.Collections.Generic.Dictionary>,System.Threading.CancellationToken)
Library.Http.HttpClientRequestAdapter.SendAsync(Library.Abstractions.RequestInformation,Library.Abstractions.Serialization.ParsableFactory,System.Collections.Generic.Dictionary>,System.Threading.CancellationToken)
CreateOrGetRequestBuilder.cs 中的 Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetRequestBuilder.PostAsync(Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetPostRequestBody, System.Action>, System.Threading.CancellationToken)
MeetingGeneratorService.cs 中的 App.Services.MeetingGeneratorService.CreateMeeting(App.Dto.v2.MeetingDto)

c# azure microsoft-graph-api asp.net-core-webapi
1个回答
0
投票

根据您的代码

graphClient.Users["[email protected]"].OnlineMeetings
,您似乎正在尝试使用此API来创建团队会议。然后我们看API文档中的权限信息,它表明不支持
Application
类型的权限,这意味着我们无法使用客户端凭证流程生成访问令牌(需要应用程序类型的权限)然后调用这个API。但是,我们可以看到您在代码中使用客户端凭证流 ->
var clientSecretCredential = new ClientSecretCredential

作为解决方法,我们可以使用日历事件 API 创建支持应用程序类型权限的在线会议。需要设置

IsOnlineMeeting = true
并添加应用程序类型权限
Calendars.ReadWrite
。我之前做过测试证明这个API可以解决你的问题。代码片段应如下所示。

// Code snippets are only available for the latest version. Current version is 5.x
using Microsoft.Graph.Models;
using Microsoft.Graph;
using Azure.Identity;

var requestBody = new Event
{
    Subject = "Let's go for lunch",
    Body = new ItemBody
    {
        ContentType = BodyType.Html,
        Content = "Does next month work for you?",
    },
    Start = new DateTimeTimeZone
    {
        DateTime = "2019-03-10T12:00:00",
        TimeZone = "Pacific Standard Time",
    },
    End = new DateTimeTimeZone
    {
        DateTime = "2019-03-10T14:00:00",
        TimeZone = "Pacific Standard Time",
    },
    Location = new Location
    {
        DisplayName = "Harry's Bar",
    },
    Attendees = new List<Attendee>
    {
        new Attendee
        {
            EmailAddress = new EmailAddress
            {
                Address = "[email protected]",
                Name = "Adele Vance",
            },
            Type = AttendeeType.Required,
        },
    },
    IsOnlineMeeting = true,
    OnlineMeetingProvider = OnlineMeetingProviderType.TeamsForBusiness,
};

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenantId";
var clientId = "clientId";
var clientSecret = "clientSecret";
var clientSecretCredential = new ClientSecretCredential(
                tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
var result = await graphClient.Users["{user_id}"].Events.PostAsync(requestBody);
© www.soinside.com 2019 - 2024. All rights reserved.