Бета-версия Microsoft Graph — преобразование из EwsId в RestId или RestImmutableEntryId

#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