Я пытаюсь создать подписку в API Graph, следуя этой документации. В нем говорится, что мне нужно сделать следующее, чтобы проверить URL-адрес уведомления:
Клиент должен ответить со следующими характеристиками в течение 10 секунд после шага 1:
- Код состояния HTTP 200 ОК.
- Тип контента text/plain.
- Тело, включающее в себя токен проверки в виде обычного текста, декодированный URL-адресом.
Когда я тестирую это, я получаю следующую ошибку проверки:
{
"error": {
"code": "ValidationError",
"message": "\"Validation: Testing client application reachability for subscription Request-Id: bd78c77c-fcdc-4ed2-9a95-ea9e704380ed\"",
"innerError": {
"date": "2024-06-28T11:21:49",
"request-id": "bd78c77c-fcdc-4ed2-9a95-ea9e704380ed",
"client-request-id": "bd78c77c-fcdc-4ed2-9a95-ea9e704380ed"
}
}
}
Ошибка здесь не имеет смысла, поскольку сообщение здесь содержит только токен проверки, который был отправлен на мою конечную точку. Я тестировал это с помощью DevTunnels в Visual Studio, а также с помощью ngrok и получил тот же результат.
Я могу подтвердить, что когда я вызываю эту конечную точку в Postman, используя тот же самый отправленный запрос, я получаю ответ 200 OK с типом контента text/plain и телом ответа "Validation: Testing client application reachability for subscription Request-Id: cdf5239b-8137-4a79-bada-8cdd1ac2fdf"
Я разрабатывал это на C# и тестировал как с пакетом Microsoft.Graph NuGet, так и записывал все это вручную в HttpClient.
Если бы кто-нибудь мог сообщить мне, что я здесь делаю неправильно, или если бы кто-нибудь из соответствующей команды Microsoft Graph мог взглянуть на этот конкретный идентификатор запроса, это было бы здорово.





Как и другие ответы, которые я видел, он сводится к text/plain, но я был немного удивлен тем, почему произошла ошибка.
В моем ApiBaseController, где находился мой код, у меня есть следующий атрибут: [Produces(System.Net.Mime.MediaTypeNames.Application.Json)]. Затем в моем коде я звонил
return new JsonResult(validationToken)
{
ContentType = "text/plain"
};
Это возвращало результат с ContentType text/plain, но Microsoft не принимала это значение. Это связано с тем, что к результату был добавлен набор кавычек. Когда я тестировал это на совершенно простом контроллере, не связанном ни с одним моим базовым кодом, я получил обратно токен проверки без каких-либо кавычек.
Чтобы это исправить, я добавил в методы, куда мне нужно было вернуть text/plain, следующее: [Produces(System.Net.Mime.MediaTypeNames.Text.Plain)].
Кажется, это не совсем соответствует тому, что Microsoft заявляет в своей документации, поскольку они утверждают, что ответ должен содержать:
Тело, включающее в себя токен проверки в виде обычного текста, декодированный URL-адресом.
Все, что я могу предположить, это то, что, поскольку ответ был заключен в кавычки, он не засчитал его как text/plain и отклонил его. Более того, похоже, что ответ должен точно совпадать, поскольку я пытался вернуть ответ с большим количеством данных, чем просто токен проверки, и он также был отклонен.
Для простоты: код теперь просто возвращает new OkObjectResult(validationToken);, и все работает, и моя проблема была связана с заголовками атрибутов моего контроллера/метода.