在 C# 中创建 MS Teams 团队 - AddAsync 返回 null [英] Create MS Teams team in C# - AddAsync returns null

查看:63
本文介绍了在 C# 中创建 MS Teams 团队 - AddAsync 返回 null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

上下文:

我正在使用 C# 中的 MS Graph API 创建新的 MS Teams 团队

I am creating new MS Teams team using MS Graph API in C#

我的代码:

var newTeam = new Team()
{
    DisplayName = model.DisplayName,
    Description = model.Description,
    AdditionalData = new Dictionary<string, object>
    {
        ["template@odata.bind"] = $"{graph.BaseUrl}/teamsTemplates('standard')",
        ["members"] = owners.ToArray()
    }
};

var team = await graph.Teams.Request().AddAsync(newTeam);

问题:

团队创建良好,但我无法获取其 ID.AddAsync 方法的返回类型是 Task 但它总是返回 null.我已经使用 Fiddler 检查了服务器响应,发现创建的团队的 id 在响应标头中返回.

The team is created fine but I can't get it's id. Return type of AddAsync method is Task<Team> but it always returns null. I have checked server response using Fiddler and found out that the id of created team is returned in response headers.

内容位置:/teams('cbf27e30-658b-4021-a8c6-4002b9adaf41')

Content-Location: /teams('cbf27e30-658b-4021-a8c6-4002b9adaf41')

很遗憾,我不知道如何访问这些信息.

Unfortunately I don't know how to access this information.

推荐答案

幸运的是,通过使用请求基类 BaseRequest 并自己发送它很容易实现.使用收到的 HttpResponseMessage,您将获得记录的标头 此处,其中包含您的新团队的 ID.

Luckily this is quite easy to achieve by using the requests base class BaseRequest and sending it yourself. With the received HttpResponseMessage you get the headers as documented here which contains the id of your new team.

代码还包括如何使用忙等待来等待团队创建完成 - 这不被视为最佳实践,但使示例更容易.更好的方法是存储团队 ID 并定期查询创建状态.

The code also includes how to wait for the team creation to finish using a busy wait – which is not considered as best practice, but makes the sample easier. A better approach would be to store the team id and periodically query the creation status.

var newTeam = new Team()
{
    DisplayName = model.DisplayName,
    Description = model.Description,
    AdditionalData = new Dictionary<string, object>
    {
        ["template@odata.bind"] = $"{graph.BaseUrl}/teamsTemplates('standard')",
        ["members"] = owners.ToArray()
    }
};

// we cannot use 'await client.Teams.Request().AddAsync(newTeam)'
// as we do NOT get the team ID back (object is always null) :(
BaseRequest request = (BaseRequest)graph.Teams.Request();
request.ContentType = "application/json";
request.Method = "POST";

string location;
using (HttpResponseMessage response = await request.SendRequestAsync(newTeam, CancellationToken.None))
    location = response.Headers.Location.ToString();

// looks like: /teams('7070b1fd-1f14-4a06-8617-254724d63cde')/operations('c7c34e52-7ebf-4038-b306-f5af2d9891ac')
// but is documented as: /teams/7070b1fd-1f14-4a06-8617-254724d63cde/operations/c7c34e52-7ebf-4038-b306-f5af2d9891ac
// -> this split supports both of them
string[] locationParts = location.Split(new[] { '\'', '/', '(', ')' }, StringSplitOptions.RemoveEmptyEntries);
string teamId = locationParts[1];
string operationId = locationParts[3];

// before querying the first time we must wait some secs, else we get a 404
int delayInMilliseconds = 5_000;
while (true)
{
    await Task.Delay(delayInMilliseconds);

    // lets see how far the teams creation process is
    TeamsAsyncOperation operation = await graph.Teams[teamId].Operations[operationId].Request().GetAsync();
    if (operation.Status == TeamsAsyncOperationStatus.Succeeded)
        break;

    if (operation.Status == TeamsAsyncOperationStatus.Failed)
        throw new Exception($"Failed to create team '{newTeam.DisplayName}': {operation.Error.Message} ({operation.Error.Code})");

    // according to the docs, we should wait > 30 secs between calls
    // https://docs.microsoft.com/en-us/graph/api/resources/teamsasyncoperation?view=graph-rest-1.0
    delayInMilliseconds = 30_000;
}

// finally, do something with your team...

这篇关于在 C# 中创建 MS Teams 团队 - AddAsync 返回 null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆