Código auxiliar de API web: Clase CrmHttpResponseException

 

Publicado: enero de 2017

Se aplica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Use la clase CrmHttpResponseException para representar Errores de estado HTTP generados durante las llamadas de la API web de Dynamics 365. Esta clase se deriva de la clase sistema .NET System.Exception estándar para integrarse fácilmente con sus mecanismos existentes de control de excepciones. Para obtener información más general, consulte Control y lanzamiento de excepciones.

La clase CrmHttpResponseException se encuentra en el archivo Exceptions.cs en la Biblioteca de código auxiliar de la API web de CRM Se usa extensivamente en las otras clases de biblioteca de código auxiliar y ejemplos web de la API web en C#. Para obtener más información, vea Use la biblioteca de código auxiliar de la API web de Microsoft Dynamics 365 (C#).

Esta clase usa funcionalidad de control de cadenas JSON desde la biblioteca Json.NET de origen abierto.

Integrantes de la clase

La siguiente tabla muestra los integrantes públicos de la clase CrmHttpResponseException.

Diagrama de clase CrmHttpResponseException de biblioteca de código auxiliar de la API web de Dynamics 365

Clase CrmHttpResponseException

Propiedades:

StackTrace – la representación de cadena de los marcos inmediatos en la pila de llamadas del servidor de Dynamics 365 cuando se lanzó la excepción, si está disponible.


Métodos:

Los constructores inicializan una instancia de esta clase y requieren un parámetro HttpContent y un parámetro de excepción interno opcional.

ExtractMessageFromContent – este método estático extrae el mensaje de error del parámetro de contenido HTTP especificado.

Uso

Normalmente, usted crea y genera un objeto CrmHttpResponseException al procesar un error de estado devuelto con un mensaje de respuesta HTTP. Por ejemplo, el siguiente código inicia un error de este tipo cuando la llamada a la función WhoAmI Function produce un error.

response = await httpClient.GetAsync("WhoAmI", HttpCompletionOption.ResponseContentRead);
if (!response.IsSuccessStatusCode)
{ 
    throw new CrmHttpResponseException(response.Content); 
}

Puede recoger y procesar objetos CrmHttpResponseException lanzados de forma similar a otras excepciones .NET estándar.

Importante

Si está usando el método HttpResponseMessage.EnsureSuccessStatusCode para convertir automáticamente errores de respuesta HTTP en objetos HttpRequestException lanzados, este método impide el uso de la clase CrmHttpResponseException. Tenga en cuenta que si usa este método, gran parte de los detalles de respuesta, incluido el código de estado, no estarán disponibles durante control de excepciones.

Lista de clases

El origen más actual para esta clase se encuentra en el paquete de NuGet de la Biblioteca de código auxiliar de la API web del SDK de CRM.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Microsoft.Crm.Sdk.Samples.HelperCode
{
    /// <summary>
    /// Produces a populated exception from an error message in the content of an HTTP response. 
    /// </summary>
    public class CrmHttpResponseException : System.Exception
    {
        #region Properties
        private static string _stackTrace;

        /// <summary>
        /// Gets a string representation of the immediate frames on the call stack.
        /// </summary>
        public override string StackTrace
        {
            get { return _stackTrace; }
        }
        #endregion Properties

        #region Constructors
        /// <summary>
        /// Initializes a new instance of the CrmHttpResponseException class.
        /// </summary>
        /// <param name="content">The populated HTTP content in Json format.</param>
        public CrmHttpResponseException(HttpContent content)
            : base(ExtractMessageFromContent(content)) { }

        /// <summary>
        /// Initializes a new instance of the CrmHttpResponseException class.
        /// </summary>
        /// <param name="content">The populated HTTP content in Json format.</param>
        /// <param name="innerexception">The exception that is the cause of the current exception, or a null reference
        /// if no inner exception is specified.</param>
        public CrmHttpResponseException(HttpContent content, Exception innerexception)
            : base(ExtractMessageFromContent(content), innerexception) { }

        #endregion Constructors

        #region Methods
        /// <summary>
        /// Extracts the CRM specific error message and stack trace from an HTTP content. 
        /// </summary>
        /// <param name="content">The HTTP content in Json format.</param>
        /// <returns>The error message.</returns>
        private static string ExtractMessageFromContent(HttpContent content)
        {
            string message = String.Empty;
            string downloadedContent = content.ReadAsStringAsync().Result;
            if (content.Headers.ContentType.MediaType.Equals("text/plain"))
            {
                message = downloadedContent;
            }
            else if (content.Headers.ContentType.MediaType.Equals("application/json"))
            {
                JObject jcontent = (JObject)JsonConvert.DeserializeObject(downloadedContent);
                IDictionary<string, JToken> d = jcontent;

                // An error message is returned in the content under the 'error' key. 
                if (d.ContainsKey("error"))
                {
                    JObject error = (JObject)jcontent.Property("error").Value;
                    message = (String)error.Property("message").Value;
                }
                else if (d.ContainsKey("Message"))
                    message = (String)jcontent.Property("Message").Value;

                if (d.ContainsKey("StackTrace"))
                    _stackTrace = (String)jcontent.Property("StackTrace").Value;
            }
            else if (content.Headers.ContentType.MediaType.Equals("text/html"))
            {
                message = "HTML content that was returned is shown below.";
                message += "\n\n" + downloadedContent;
            }
            else
            {
                message = String.Format("No handler is available for content in the {0} format.",  
                    content.Headers.ContentType.MediaType.ToString());
            }
            return message;
            #endregion Methods
        }
    }
}

Ver también

Introducción a la API web de Microsoft Dynamics 365 (C#)
Iniciar un proyecto de la web API de Dynamics 365 en Visual Studio (C#)
Use la biblioteca de código auxiliar de la API web de Microsoft Dynamics 365 (C#)
Código auxiliar de API web: Clase de autenticación
Código auxiliar de la API web: Clases de configuración

Microsoft Dynamics 365

© 2017 Microsoft. Todos los derechos reservados. Copyright