Microsoft Graph — Teams API работает в Graph Explorer, но не через код

#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);
            }
        }
 

Это будет работать.