Del via


Web API Helper-kode: CrmHttpResponseException-klasse

 

Udgivet: januar 2017

Gælder for: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Brug CrmHttpResponseException-klassen til at repræsentere HTTP-statusfejl, der er genereret under Dynamics 365 Web API-kald. Denne klasse er afledt af standardklassen for .NET System.Undtagelse med henblik på nemt at integrere med dine eksisterende mekanismer til håndtering af undtagelser. Hvis du vil have flere generelle oplysninger, skal du se Håndtering og udløsning af undtagelser.

CrmHttpResponseException-klassen er placeret i filen Exception.cs i CRM SDK Web API Helper-biblioteket. Det er udbredt i andre klasser for hjælperbiblioteket og C# Web API-eksempler. Du kan finde flere oplysninger under Brug af Microsoft Dynamics 365 Web API Helper-bibliotek (C#).

Denne klasse benytter håndteringsfunktioner for JSON-strenge fra biblioteket for åben kildekode Json.NET.

Klassemedlemmer

Følgende tabel viser de offentlige medlemmer af CrmHttpResponseException-klassen.

CrmHttpResponseException-klassediagram til Dynamics 365 Web API Helper-bibliotek

CrmHttpResponseException-klasse

Egenskaber:

StackTrace – strenggengivelsen af de umiddelbare strukturer på Dynamics 365-serverens kaldestak, da undtagelsen blev udløst, hvis den er tilgængelig.


Metoder:

Konstruktørerne initialiserer en forekomst af denne klasse og kræver en HttpContent-parameter og en valgfri parameter for indre undtagelse.

ExtractMessageFromContent – Denne statiske metode udtrækker fejlmeddelelsen fra den angivne HTTP-indholdsparameter.

Brug

Du opretter og udløser typisk et CrmHttpResponseException-objekt, når behandlingen af en statusfejl returneres med en HTTP-svarmeddelelse. Følgende kode udløser f.eks. sådan en fejl, når WhoAmI Function-funktionskaldet mislykkes.

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

Du kan fange og behandle udløste CrmHttpResponseException-objekter på samme måde som for andre .NET-standardundtagelser.

Vigtigt

Hvis du bruger metoden HttpResponseMessage.EnsureSuccessStatusCode til automatisk at konvertere HTTP-svarfejl til udløste HttpRequestException-objekter, vil denne fremgangsmåde derefter udelukke anvendelsen af CrmHttpResponseException-klassen. Bemærk, at hvis du bruger denne metode, vil mange af oplysningerne i svarmeddelelsen, herunder statuskoden, ikke er tilgængelige under undtagelseshåndtering.

Klasseliste

Den mest aktuelle kilde for denne klasse findes i CRM SDK Web API-hjælperbibliotekets NuGet-pakke.

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

Se også

Introduktion til Microsoft Dynamics 365 Web API (C#)
Starte et Dynamics 365 Web API-projekt i Visual Studio (C#)
Brug af Microsoft Dynamics 365 Web API Helper-bibliotek (C#)
Web API Helper-kode: godkendelsesklasse
Web-API-hjælpekode: konfiguration af klasser

Microsoft Dynamics 365

© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret