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

У меня есть требование автоматически публиковать сообщение на канале 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}",
                    "[email protected]": "#Microsoft.Teams.GraphSvc.conversationIdentityType",
                    "conversationIdentityType": "channel"
                }
            }
        }
    ]
}

Когда нажимается Run Query, сообщение успешно публикуется и упоминается канал. Затем я извлек фрагмент кода из обозревателя графиков для кода 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}\",\"[email protected]\":\"#Microsoft.Teams.GraphSvc.conversationIdentityType\",\"conversationIdentityType\":\"channel\"}"}
                }
            }
        }
    }
};

await graphClient.Teams["{group id}"].Channels["{channel id}"].Messages
    .Request()
    .AddAsync(chatMessage);

Однако при выполнении кода отображается следующая ошибка:

ServiceException: Код: BadRequest Сообщение: отправлено неверное тело запроса.

Удаление упоминаний или изменение упоминаний для использования Пользователя работает успешно. Также обратите внимание, что я пытался использовать как Microsoft.Graph, так и Microsoft.Graph.Beta.

Привет, Марк, если опубликованный ответ решает ваш вопрос, проголосуйте за него или отметьте его как ответ, нажав на галочку. Это помогает другим найти ответы на свои вопросы. См. meta.stackexchange.com/questions/5234/…

Shiva Keshav Varma 12.12.2020 12:34

Какую dll версии Microsoft graph вы используете в своем приложении?

Trinetra-MSFT 14.12.2020 05:51

@Trinetra-MSFT Я использую Microsoft.Graph.Beta версии 0.35.0-preview. Однако Шива - ответ MSFT Identity ниже работал нормально

Mark Cassar 14.12.2020 07:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
438
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я провел долгое исследование по этому вопросу и обнаружил, что проблема с десериализацией происходит на сервере Graph из-за кода, написанного таким образом. Основная проблема с беседой в свойстве Mentioned. Серверу Graph не удалось понять сериализованное содержимое, поэтому попробуйте его десериализовать перед отправкой запроса, как показано ниже.

Identity A = JsonConvert.DeserializeObject<Identity>("{\"id\":\"{channel id}\",\"displayName\":\"{channel name}\",\"[email protected]\":\"#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:[email protected]"].Messages
                .Request()
                .AddAsync(chatMessage);

            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }
        }

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

Другие вопросы по теме