在 C# 中创建 MS Teams 团队 - AddAsync 返回 null [英] Create MS Teams team in C# - AddAsync returns 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屋!