Ошибка «Ресурс не найден для сегмента» при чтении электронной почты из Graph APIC#

Место общения программистов C#
Ответить
Anonymous
 Ошибка «Ресурс не найден для сегмента» при чтении электронной почты из Graph API

Сообщение Anonymous »

У меня есть веб-надстройка Outlook, которая считывает выбранное в данный момент электронное письмо с Exchange Server с помощью API Graph перед его дальнейшей обработкой. Соответствующий код:

Код: Выделить всё

private static async Task GetEmailMessageAsync(MailboxItemModel mailboxItem) =>
await GetGraphClient(mailboxItem).Me.Messages[mailboxItem.ItemId].Content.GetAsync();

private static GraphServiceClient GetGraphClient(MailboxItemModel mailboxItem) =>
new GraphServiceClient(new ExistingTokenProvider(mailboxItem.Token));

private sealed class ExistingTokenProvider : IAuthenticationProvider {

private readonly string _token;

public ExistingTokenProvider(string token) => _token = token;

public Task AuthenticateRequestAsync(
RequestInformation request,
Dictionary additionalAuthenticationContext = null,
CancellationToken cancellationToken = new CancellationToken()) {
request.Headers["Authorization"] = new[] { "Bearer " + _token };
return Task.CompletedTask;
}
}
Это ссылка на пакет NuGet Microsoft.Graph версии 5.88.0.

Код: Выделить всё

mailboxItem.ItemId
и mailboxItem.Token отправляются из JavaScript и получаются следующим образом:

Код: Выделить всё

/** Public Client Application for getting tokens.
* @type {import('@azure/msal-browser').IPublicClientApplication}
* @readonly
*/
var _pca = undefined;

var initialiseNAA = function() {
var clientId = ViewState.GetMsalClientId();
console.log("Creating NPCA for client " + clientId + "...");
msal.createNestablePublicClientApplication({ auth: { clientId: clientId } }).then(
function(pca) {
_pca = pca;
console.log("Created NPCA for client " + clientId + ".");
},
function(error) {
console.log("Failed to create NPCA for client " + clientId + ": " + JSON.stringify(error));
});
};

/** Get Exchange data for the selected mailbox item.
* @param {getMailboxItemOnSuccess} onSuccess Continuation to run when the data has been read.
*/
var getMailboxItem = function(onSuccess) {
console.log("Getting Exchange data...");
var itemId = Office.context.mailbox.item.itemId;
console.log("itemId: " + itemId);
var afterSave = function() {
var request = { scopes: ViewState.GetMsalScope().split(" ") };
console.log("Acquiring PCA token silently...");
_pca.acquireTokenSilent(request).then(
function(result) {
console.log("Acquired PCA token silently.");
//console.log("graphToken: " + result.accessToken);
onSuccess({ url: _graphUrl, token: result.accessToken, itemId: itemId });
},
function(error1) {
console.log("Failed to acquire PCA token silently: " + JSON.stringify(error1));
if(error1 instanceof msal.InteractionRequiredAuthError) {
console.log("Acquiring PCA token interactively...");
_pca.acquireTokenPopup(request).then(
function(result) {
console.log("Acquired PCA token interactively.");
//console.log("graphToken: " + result.accessToken);
onSuccess({ url: _graphUrl, token: result.accessToken, itemId: itemId });
},
function(error2) {
console.log("Failed to acquire PCA token interactively: "  + JSON.stringify(error2));
_handleOfficeError(error2, "Cannot get a PCA token to read the mailbox item.");
}
);
} else {
_handleOfficeError(error1, "Cannot get a PCA token to read the mailbox item.");
}
}
);
};
if(itemId) {
// We have the item ID already, it's safe to continue.
afterSave();
} else {
// We must save the item first before we can read data.
console.log("Saving the item first...");
Office.context.mailbox.item.saveAsync(function(saveAsyncResult) {
if(saveAsyncResult.status !== Office.AsyncResultStatus.Succeeded) {
_handleOfficeError(saveAsyncResult, "Cannot save a draft of the mailbox item.");
return;
}
itemId = saveAsyncResult.value;
console.log("itemId: " + itemId);
afterSave();
});
}
};
XML-манифест надстройки настроен на использование проверки подлинности вложенных приложений (NAA):

Код: Выделить всё

MY_CLIENT_ID
api://MY_SITE/MY_CLIENT_ID

Mail.Read
Mail.Read.Shared


Код: Выделить всё

MY_CLIENT_ID
указывает на приложение Entra, настроенное согласно https://learn.microsoft.com/en-us/offic ... our-add-in. Приложение существует исключительно для целей NAA. Он содержит только соответствующие URL-адреса перенаправления SPA и является мультитенантным.
У меня все работает нормально, но два тестировщика сообщили об исключениях из этого шаблона:

Код: Выделить всё

Type: Microsoft.Graph.Models.ODataErrors.ODataError
Message: Resource not found for the segment '5NET4'.
AdditionalData:
Error: {"AdditionalData":{},"BackingStore":{"ReturnOnlyChangedValues":false,"InitializationCompleted":true},"Code":"RequestBroker--ParseUri","Details":null,"InnerError":null,"Message":"Resource not found for the segment '5NET4'.","Target":null}
ResponseStatusCode: 400
ResponseHeaders:
Cache-Control: private
Date: Mon, 11 Aug 2025 07:29:44 GMT
strict-transport-security: max-age=31536000
request-id: 6a6dda61-78ce-4ce9-a3c1-8c668953f9b3
client-request-id: 14f88e88-c493-4095-b5f6-56159ab0de6e
x-ms-ags-diagnostic: {"ServerInfo":{"DataCenter":"North Europe","Slice":"E","Ring":"4","ScaleUnit":"005","RoleInstance":"DU6PEPF00021B6F"}}
HResult: 0x80131500
Source: Microsoft.Kiota.Http.HttpClientLibrary
TargetSite: Void MoveNext()
StackTrace:
at Microsoft.Kiota.Http.HttpClientLibrary.HttpClientRequestAdapter.d__28.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Kiota.Http.HttpClientLibrary.HttpClientRequestAdapter.d__21`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Kiota.Http.HttpClientLibrary.HttpClientRequestAdapter.d__21`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Graph.Me.Messages.Item.Value.ContentRequestBuilder.d__3.MoveNext()
Имя сегмента представляет собой случайную буквенно-цифровую строку, которая ничего для нас не значит и меняется каждый раз, когда регистрируется ошибка.
Я заметил, что у одного пользователя лицензия на Office находится в другой стране, чем у остальных из нас. Я изменил его, чтобы он соответствовал остальным из нас, и ошибка исчезла. Однако другой пользователь получает сообщение об ошибке, даже если указана правильная страна.
Может ли кто-нибудь сказать мне основную причину этой ошибки?
ОБНОВЛЕНИЕ
Пользователь А все утро получал сообщение об ошибке, но теперь работает нормально. Ничего не изменилось.
Пользователь Б по-прежнему не работает.
Мой пользователь все время работал.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -graph-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»