#c# #microsoft-graph-api #microsoft-graph-sdks #microsoft-graph-mail
#c# #microsoft-graph-api #microsoft-graph-sdks #microsoft-graph-mail
Вопрос:
Я пытаюсь преобразовать EwsId
либо в RestId
, либо RestImmutableEntryId
с помощью бета-версии Microsoft Graph.
Он отлично работает для преобразования RestId
s в RestImmutableEntryId
s, но пока не удалось преобразовать из EwsId
. На данный момент документации, по понятным причинам, недостаточно, поскольку она находится в бета-версии, но я нашел некоторую документацию, в которой говорится, что это должно быть возможно:
Примечание: Вы также можете использовать
translateExchangeIds
для переноса приложений веб-служб Exchange в Microsoft Graph «.
Что я сделал, так это извлек и Id
из .msg
файла, преобразовал его в строку Base64 и отправил запрос на преобразование:
var client = new GraphServiceClient(etc..);
var messageId = Convert.ToBase64String(
System.Text.Encoding.UTF8.GetBytes("<someId@something.prod.outlook.com>")
);
var req = client
.Me
.TranslateExchangeIds(new [] { messageId },
ExchangeIdFormat.RestImmutableEntryId,
ExchangeIdFormat.EwsId);
var translateExchangeIdsCollectionPage = await req.Request().PostAsync();
Я ожидаю получить ConvertIdResult
ответ, но вместо этого я получаю Microsoft.Graph.GenericError
«[IdConverter::IsPublicFolder] Недопустимый идентификатор сжатия»`
Я не смог найти никакой документации, связанной с этой ошибкой, и что нужно сделать, чтобы ее исправить. Я не эксперт в Outlook, поэтому, насколько я знаю, я использую неправильный идентификатор или что-то в этом роде.
Ответ №1:
Вам нужно использовать HttpServerUtility.UrlTokenEncode
вместо Convert.ToBase64String
.
Хотя технически оба генерируют строку в кодировке Base64, существуют некоторые незначительные различия в кодировке. Это потому, что Base64 считает символы
, /
и =
допустимыми, а URL-адреса — нет. Чтобы справиться с этим, RFC 4648 определяет base64url
кодировку, которая использует только безопасные символы URL. Exchange использует эту кодировку Base64Url для кодирования идентификаторов.
Комментарии:
1. Спасибо за ответ. Я должен был сказать, что я на ядре dotnet. Для других, кто интересуется, эквивалентом,
UrlTokenEncode
по-видимому, является WebEncoders.Base64UrlEncode . Я не уверен, что это проблема. Это POST-запрос кMicrosoft Graph
API для его преобразования, где идентификатор является частью тела запроса. Я все равно пробовал, никогда не знаешь. Но получил обратноFormatError
высказывание недопустимой длины для массива символов или строки Base-64.2. Между этими двумя кодировками могут быть различия. Причина, по которой вам нужно использовать ту же кодировку, заключается в том, что она ищет запись по закодированному идентификатору . Если вы закодируете его иначе, чем Exchange, он не будет соответствовать.
3. На Github также есть закрытый выпуск по этой теме: github.com/microsoftgraph/microsoft-graph-docs/issues/3554