#c# #microsoft-graph-api #microsoft-teams
#c# #microsoft-graph-api #microsoft-teams
Вопрос:
У меня есть требование автоматически публиковать сообщение на канале Teams и упоминать канал. К сожалению, через MS Flow возможность указать весь канал недоступна, однако, похоже, что через бета-версию Graph API я могу упомянуть весь канал.
Сначала я попробовал через Graph Explorer, изменив ГЛАГОЛ на POST и установив URL на <https://graph.microsoft.com/beta/teams/{group ID}/channels/{channel id}/messages>
Кроме того, добавлено приведенное ниже тело запроса
{
"subject": "@Mention in Teams channel post!",
"body": {
"content": "Hello <at id ='0'>{channel name}</at>, Test message on the channel with at mention.",
"contentType": "html"
},
"mentions": [
{
"id": 0,
"mentionText": "{channel name}",
"mentioned": {
"conversation": {
"id": "{channel id}",
"displayName": "{channel name}",
"conversationIdentityType@odata.type": "#Microsoft.Teams.GraphSvc.conversationIdentityType",
"conversationIdentityType": "channel"
}
}
}
]
}
При нажатии кнопки Выполнить запрос сообщение успешно отправляется и упоминается канал. Затем я извлек фрагмент кода из graph Explorer для кода C #, в результате чего появился приведенный ниже код
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
var chatMessage = new ChatMessage
{
Subject = "@Mention in Teams channel post!",
Body = new ItemBody
{
Content = "Hello <at id ='0'>{channel name}</at>, Test message on the channel with at mention.",
ContentType = BodyType.Html
},
Mentions = new List<ChatMessageMention>()
{
new ChatMessageMention
{
Id = 0,
MentionText = "{channel name}",
Mentioned = new IdentitySet
{
AdditionalData = new Dictionary<string, object>()
{
{"conversation", "{"id":"{channel id}","displayName":"{channel name}","conversationIdentityType@odata.type":"#Microsoft.Teams.GraphSvc.conversationIdentityType","conversationIdentityType":"channel"}"}
}
}
}
}
};
await graphClient.Teams["{group id}"].Channels["{channel id}"].Messages
.Request()
.AddAsync(chatMessage);
Однако при выполнении кода отображается приведенная ниже ошибка:
Исключение ServiceException: сообщение Code: BadRequest: отправлено неверное тело запроса.
Удаление упоминаний или изменение упоминаний для использования пользователем успешно работает. Также, пожалуйста, обратите внимание, что я пытался использовать оба Microsoft.Graph и Microsoft.Graph.Beta
Комментарии:
1. Привет, Марк, если опубликованный ответ решает ваш вопрос, пожалуйста, проголосуйте за него или отметьте его как ответ, нажав на галочку. Это помогает другим находить ответы на свои вопросы. Видишь meta.stackexchange.com/questions/5234 /…
2. Какую версию DLL Microsoft Graph вы используете в своем приложении?
3. @Trinetra-MSFT Я использую Microsoft. График. Бета-версия 0.35.0-предварительный просмотр. Однако приведенный ниже ответ Shiva — MSFT Identity сработал нормально
Ответ №1:
Я провел долгое исследование по этому вопросу и обнаружил, что на сервере Graph возникает проблема с десериализацией из-за написанного таким образом кода. Основная проблема связана с диалогом в упомянутом свойстве. Графическому серверу не удалось понять сериализованное содержимое, поэтому попробуйте десериализовать его перед отправкой запроса, как показано ниже.
Identity A = JsonConvert.DeserializeObject<Identity>("{"id":"{channel id}","displayName":"{channel name}","conversationIdentityType@odata.type":"#Microsoft.Teams.GraphSvc.conversationIdentityType","conversationIdentityType":"channel"}");
var chatMessage = new ChatMessage
{
Subject = "@Mention in Teams channel post!",
Body = new ItemBody
{
Content = "Hello <at id ='0'>General</at>, Test message on the channel with at mention.",
ContentType = BodyType.Html
},
Mentions = new List<ChatMessageMention>()
{
new ChatMessageMention
{
Id = 0,
MentionText = "General",
Mentioned = new IdentitySet
{
AdditionalData = new Dictionary<string, object>()
{
{"conversation", A}
}
}
}
}
};
try
{
await graphClient.Teams["d3b31e36-d63d-4bbe-9478-b4cc7cb17a3d"].Channels["19:342b9f379eb340048b16d9859d9e3712@thread.tacv2"].Messages
.Request()
.AddAsync(chatMessage);
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
Это будет работать.