Codice helper API Web: CrmHttpResponseException class

 

Data di pubblicazione: gennaio 2017

Si applica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Utilizza la classe CrmHttpResponseException per rappresentare gli errori di stato HTTP generati durante le chiamate API Dynamics 365. Questa classe è derivata dalla classe standard .NET System.Exception per una facile integrazione con i meccanismi esistenti di gestione delle eccezioni. Per ulteriori informazioni generali, vedi Gestione e generazione di eccezioni.

La classe CrmHttpResponseException si trova nel file Exceptions.cs nella Libreria helper API Web CRM SDK È utilizzata in modo considerevole nelle altre classi della libreria helper e negli esempi API Web C#. Per ulteriori informazioni, vedere Utilizzare la libreria helper API Web di Microsoft Dynamics 365 (C#).

Questa classe utilizza la funzionalità di gestione stringa JSON dalla libreria Json.NET open source.

Membri della classe

Nella tabella seguente vengono elencati i membri pubblici della classe CrmHttpResponseException.

Libreria helper API Web Dynamics 365 - Diagramma classe CrmHttpResponseException

Classe CrmHttpResponseException

Proprietà:

StackTrace - rappresentazione di stringa dei frame immediati nello stack di chiamate del server Dynamics 365 quando viene generata l'eccezione, se disponibile.


Metodi:

I costruttori inizializzano un'istanza di questa classe e richiedono un parametro HttpContent e un parametro facoltativo di eccezione interna.

ExtractMessageFromContent - questo metodo statico estrae il messaggio di errore dal parametro HTTP specificato.

Uso

In genere, crei e generi un oggetto CrmHttpResponseException quando si elabora un errore di stato restituito con un messaggio di risposta HTTP. Ad esempio, il codice seguente genera un errore quando la chiamata alla funzione WhoAmI Function non riesce.

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

Puoi rilevare ed elaborare oggetti CrmHttpResponseException generati come per le altre eccezioni .NET standard.

Importante

Se utilizzi il metodo HttpResponseMessage.EnsureSuccessStatusCode per convertire automaticamente gli errori di risposta HTTP in oggetti HttpRequestException, questo approccio preclude l'utilizzo della classe CrmHttpResponseException. Se utilizzi questo approccio, la maggior parte dei dettagli del messaggio di risposta, incluso il codice di stato, non sarà disponibile durante la gestione delle eccezioni.

Elenco delle classi

L'origine più aggiornata per la classe è disponibile nella Libreria helper API Web CRM SDK nel pacchetto di NuGet.

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
        }
    }
}

Vedere anche

Informazioni generali sull'API Web Microsoft Dynamics 365 (C#)
Avviare un progetto API Web di Dynamics 365 in Visual Studio (C#)
Utilizzare la libreria helper API Web di Microsoft Dynamics 365 (C#)
Codice helper API Web: classe di autenticazione
Codice helper API Web: classi di configurazione

Microsoft Dynamics 365

© 2017 Microsoft. Tutti i diritti sono riservati. Copyright