Partager via


Code d'assistance de l'API Web : Classe CrmHttpResponseException

 

Date de publication : janvier 2017

S’applique à : Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Utilisez la classe CrmHttpResponseException pour représenter les erreurs d'état HTTP générées lors d'appels de l'API Web de Dynamics 365. Cette classe est dérivée de la classe System.Exception .NET standard à intégrer facilement à vos mécanismes de gestion des exceptions existants. Pour des informations générales, voir Gestion et renvoi d'exceptions.

La classe CrmHttpResponseException se situe dans le fichier Exceptions.cs de la Bibliothèque d'aide de l'API Web du Kit de développement logiciel (SDK) CRM Il est utilisé régulièrement dans les autres classes de bibliothèques d'aide et exemples de l'API Web C#. Pour plus d'informations, voir Utiliser la bibliothèque d'aide de l'API Web Microsoft Dynamics 365 (C#).

Cette classe utilise la fonctionnalité de gestion de chaîne JSON de la bibliothèque Json.NET à code source libre.

Membres de la classe

Le tableau suivant présente les membres de la classe CrmHttpResponseException.

Bibliothèque d'aide de l'API Web de Dynamics 365 - Diagramme de la classe CrmHttpResponseException

Classe CrmHttpResponseException

Propriétés :

StackTrace – la représentation de chaîne des crades immédiats sur la pile des appels du serveur Dynamics 365 lorsque l'exception a été levée, le cas échéant.


Méthodes :

Le constructeur lancer une instance de cette classe et nécessite un paramètre HttpContent et un paramètre d'exception interne facultatif.

ExtractMessageFromContent – cette méthode statique extrait le message d'erreur du paramètre de contenu HTTP spécifié.

Utilisation

En règle générale, vous créez et levez un objet CrmHttpResponseException lors du traitement d'une erreur d'état renvoyée avec un message de réponse HTTP. Par exemple, le code suivant renvoie une telle erreur lorsque l'appel de fonction WhoAmI Function échoue.

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

Vous pouvez intercepter et traiter les objets CrmHttpResponseException renvoyés de la même manière que d'autres exceptions .NET standard.

Important

Si vous utilisez la méthode HttpResponseMessage.EnsureSuccessStatusCode pour convertir automatiquement les erreurs de réponse HTTP dans les objets HttpRequestException renvoyés, cette approche exclut l'utilisation de la classe CrmHttpResponseException. Notez que si vous utilisez cette approche, la plupart des détails du message de réponse, notamment le code d'état, ne seront pas disponibles pendant le traitement des exceptions.

Liste des classes

La source la plus récente pour cette classe est disponible dans le package NuGet Bibliothèque d'aide de l'API Web du Kit de développement logiciel (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
        }
    }
}

Voir aussi

Se familiariser avec l'API Web Microsoft Dynamics 365 (C#)
Démarrer un projet de l'API Web de Dynamics 365 dans Visual Studio (C#)
Utiliser la bibliothèque d'aide de l'API Web Microsoft Dynamics 365 (C#)
Code d'assistance de l'API Web : Classe Authentication
Code d'aide de l'API Web : classes de configuration

Microsoft Dynamics 365

© 2017 Microsoft. Tous droits réservés. Copyright