График Azure AD: безопасная двоичная сериализация не поддерживается на этой платформе

Мы работаем на .NET Core 2.1 и иногда получаем исключение "Безопасная двоичная сериализация не поддерживается на этой платформе" при выполнении следующего запроса:

await _adClient.Users[userId].AppRoleAssignments.ExecuteAsync();

Повторное выполнение запроса часто срабатывает, поэтому выполняется какое-то условие, при котором двоичная сериализация не выполняется (или завершается успешно?) При последующих запросах? Тем не менее, если я перезапущу службу, она часто будет работать и по первому запросу.

Мы используем старый клиент AD Graph, потому что 1) клиент Microsoft Graph еще не полностью поддерживает AppRoleAssignments и 2) то, что поддерживается, является частью бета-версии и не рекомендуется для производственного использования.

Полный стек вызовов ниже:

System.Data.Services.Client.BaseAsyncResult.EndExecute<T>(object source, string method, IAsyncResult asyncResult)
System.Data.Services.Client.QueryResult.EndExecuteQuery<TElement>(object source, string method, IAsyncResult asyncResult)
System.Data.Services.Client.DataServiceRequest.EndExecute<TElement>(object source, DataServiceContext context, string method, IAsyncResult asyncResult)
System.Data.Services.Client.DataServiceQuery<TElement>.EndExecute(IAsyncResult asyncResult)
Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper+<>c__DisplayClass4c<TSource, TInterface>.<ExecuteAsync>b__4a(IAsyncResult r)
System.Threading.Tasks.TaskFactory<TResult>.FromAsyncCoreLogic(IAsyncResult iar, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, Task<TResult> promise, bool requiresSynchronization)
Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper.ExecuteAsync<TSource, TInterface>(DataServiceQuery<TSource> inner)
Microsoft.Azure.ActiveDirectory.GraphClient.AppRoleAssignmentCollection.<ExecuteAsync>b__2()
Merck.SeaMonkey.Api.AzureADApi.Controllers.UserController.GetApplicationRoleAssignments(string userId) in UserController.cs

Новый клиент Microsoft Graph здесь не вариант, хотя я полагаю, мы можем перейти к базовому интерфейсу REST, который представляет собой небольшую работу со всей логикой повторных попыток, анализом результатов и т. Д., Которые мы полагались на клиент графа. делать.

ОБНОВЛЕНИЕ: укажите источник исключения, мы предполагаем, что есть проблема с сериализацией объекта в ответе OData. Однако, используя AD Graph Explorer, мы видим очень простой ответ пустого массива значений вместе со ссылкой на документ метаданных для объекта. Мы часто заставляли проблему повторяться, удаляя и добавляя новые назначения ролей приложения, но мы не можем заставить ее возникать на 100% надежно. Похоже, что какое-то состояние повреждено, возможно, в каком-то внутреннем кеше?


person Jim O'Neil    schedule 08.11.2018    source источник


Ответы (1)


Я часто использую этот вызов api, но я использую прямой вызов httpClient для отдыха на старом графике.

Я публикую это только как ссылку - обратите внимание на явную версию в URL-адресе (1.6). Я также публикую объект, в который я десериализуюсь, он может не соответствовать официальной схеме объекта.

    // OLD Graph End point    //  like ... https://graph.windows.net/{tenant-id}/users/{id}/appRoleAssignments?api-version=1.6
   urlUserInviteToUse = "https://graph.windows.net/" + m_CfgHlp.TenIdInB2C + "/" + ObjFamilyName + "/" + DirObjIdToGet + "/" + ObjFunctionCall + "?api-version=1.6";

Из-за остальной полезной нагрузки строки api я эффективно использую JsonConvert.DeserializeObject для перехода от полезной нагрузки к объектному классу. Обратите внимание, что даты не десериализуются как даты.

public class AppRoleAssignmentsRoot
{
    public string odatametadata { get; set; }
    public AppRoleAssignment[] value { get; set; }
}

public class AppRoleAssignment
{
    public string odatatype { get; set; }
    public string objectType { get; set; }
    public string objectId { get; set; }
    public object deletionTimestamp { get; set; }
    public object creationTimestamp { get; set; }
    public string id { get; set; }
    public string principalDisplayName { get; set; }
    public string principalId { get; set; }
    public string principalType { get; set; }
    public string resourceDisplayName { get; set; }
    public string resourceId { get; set; }
}
person Sql Surfer    schedule 15.11.2018