Obtener extensiones abiertas usando Graph API C#

Estoy construyendo un ASP. NET Sitio web básico, donde el usuario se registra, y es capaz de guardar cosas como el tema de la página, que luego desencadena algún código js:

var data = {
    userName: userName,
    key: "theme",
    value: localStorage.getItem("theme")
}

var pendingRequest;

if (pendingRequest) {
    pendingRequest.abort()
    pendingRequest = null;
}

pendingRequest = $.post('/Account/setExtension', data, function (data) {
    pendingRequest = null;
    $('#settingsModal').modal('hide');
});

que llama al controlador:

        [HttpPost]
    public void setExtension(string userName, string key, string value)
    {
        Dictionary addData = new Dictionary
        {
            {key, value }
        };
        GraphHelper.updateExtension(userName, "com.user.roamingSettings", addData).ConfigureAwait(false);
    }

que llama a los cheques si la extensión existe, y luego decide crearla, o actualizar la extensión existente:

        public static async Task extensionExistsAsync(string userName, string extensionName)
    {
        try
        {
            var graphClient = GetAuthenticatedClient();

            // if extension doesnt exist
            bool extensionFound = false;
            var extensions = await graphClient.Users[userName].Extensions.Request().GetAsync();

            foreach (var extension in extensions)
            {
                if (extension.Id == extensionName)
                {
                    extensionFound = true;
                }
            }
            return extensionFound;

        }
        catch (Exception e)
        {
            Debug.WriteLine(e.Message.ToString());
            throw;
        }
    }

El problema es que el código deja de funcionar en esta línea:

var extensions = await graphClient.Users[userName].Extensions.Request().GetAsync();

No tira ni nada. Pasando por su línea por línea, regresa todo el camino a la asignación, y la ventana de salida está vacía cuando se detiene. ¿Por qué es esto? ¿Cómo puedo obtener una extensión por nombre, o conseguir todas las extensiones para ver cuáles existen, ya sea por gráfico api, o llamadas?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por coderchampion


3 Respuestas:

  • Cuando usted utiliza la llamada siguiente

    var extensions = await graphClient.Users[userName].Extensions.Request().GetAsync();
    

    vas a estar recibiendo Extensiones de Usuario CollectionPage objeto que da la lista de extensiones de un usuario.

    Esta página no tiene propiedad Id, los objetos de extensión que están presentes en este objeto UserExtensionsCollectionPage lo tienen. Así que utilice el siguiente código para imprimir el id y el tipo de las extensiones.

    var extensions = await graphClient.Users["a1ee289f-4cab-4fc3-885f-d4cbefb48895"].Extensions.Request().GetAsync();
    foreach(var data in extensions.CurrentPage)
    {
         Console.WriteLine("Id: " + data.Id + "Type: " + data.ODataType );
    }
    

    Esto le dará los datos como abajo.

    enter image description here

    Respondida el Dec 17, 2020 a las 03:51 - por pythonpirate

    Votos positivos: 0 | Votos negativos: 0

  • Para solucionar el problema y obtener las extensiones abiertas usando Graph API en C

    , puedes seguir los siguientes pasos:

    • Verifica que tengas los permisos necesarios para acceder a las extensiones del usuario en Graph API. Necesitarás permisos adecuados en el token de autenticación.
    • Asegúrate de que el valor de `userName` que estás pasando al método `extensionExistsAsync` sea válido y esté en el formato correcto. Debe ser el identificador único del usuario en el sistema.
    • Activa la captura de excepciones en el `extensionExistsAsync` para poder ver si hay algún error específico que esté ocurriendo al intentar obtener las extensiones.
    • Puedes intentar cambiar la forma en que accedes a las extensiones del usuario, utilizando el siguiente código:
    csharp
    var extensions = await graphClient.Users[userName].Extensions.Request().Select("id").GetAsync();
    

    Esto puede ayudar a reducir la cantidad de datos devueltos y evitar posibles problemas al obtener las extensiones.

    • Verifica que la clase `GraphHelper` esté configurada correctamente para obtener una instancia válida de `graphClient` antes de llamar a los métodos que interactúan con Graph API.

    Siguiendo estos pasos y asegurándote de manejar correctamente los posibles errores, deberías poder obtener las extensiones abiertas utilizando Graph API en C#.

    Respondida el Dec 18, 2020 a las 03:54 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando al llamar a graphClient.Users[userName].Extensions.Request().GetAsync() probablemente se deba a una o más de las siguientes razones:

    1. Falta de permisos:

    Para recuperar extensiones, la aplicación debe tener los permisos adecuados asignados. Asegúrate de que tu aplicación tenga el permiso extension.readwrite.all o extension.read.all.

    2. Nombre de usuario incorrecto:

    El parámetro userName debe ser el nombre de usuario principal (UPN) del usuario para el que deseas recuperar extensiones. Verifica que estés usando el UPN correcto.

    3. Error de red:

    El problema podría deberse a un error temporal de red. Inténtalo de nuevo más tarde o verifica la conexión a Internet.

    4. Código desactualizado:

    Asegúrate de utilizar la versión más reciente de la biblioteca de autenticación de Microsoft Graph. Las versiones anteriores pueden causar problemas.

    5. Extensiones deshabilitadas:

    Las extensiones deben estar habilitadas para el inquilino. Verifica en el Centro de administración de Microsoft 365 si las extensiones están habilitadas.

    Solución alternativa:

    Si aún tienes problemas para recuperar extensiones, puedes intentar usar el explorador Graph Explorer para consultar directamente la API de Microsoft Graph. Esto te permitirá aislar el problema y verificar si se trata de un problema de código o de configuración.

    Para recuperar extensiones por nombre usando Graph API:

    csharp
    using Microsoft.Graph;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace GraphExtensions
    {
        public class ExtensionHelper
        {
            private static GraphServiceClient _graphClient;
    
            public static async Task GetExtensionByNameAsync(string userName, string extensionName)
            {
                if (_graphClient == null)
                {
                    _graphClient = GetAuthenticatedClient();
                }
    
                try
                {
                    var extension = await _graphClient.Users[userName].Extensions[extensionName].Request().GetAsync();
                    return extension;
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e.Message.ToString());
                    throw;
                }
            }
    
            private static GraphServiceClient GetAuthenticatedClient()
            {
                // Implement your authentication logic here
            }
        }
    }
    

    Para recuperar todas las extensiones:

    csharp
    using Microsoft.Graph;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace GraphExtensions
    {
        public class ExtensionHelper
        {
            private static GraphServiceClient _graphClient;
    
            public static async Task> GetAllExtensionsAsync(string userName)
            {
                if (_graphClient == null)
                {
                    _graphClient = GetAuthenticatedClient();
                }
    
                try
                {
                    var extensions = await _graphClient.Users[userName].Extensions.Request().GetAsync();
                    return extensions.CurrentPage;
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e.Message.ToString());
                    throw;
                }
            }
    
            private static GraphServiceClient GetAuthenticatedClient()
            {
                // Implement your authentication logic here
            }
        }
    }
    

    Respondida el Dec 18, 2020 a las 03:56 - por Gemini

    Votos positivos: 0 | Votos negativos: 0