Web API-Hilfecode: CrmHttpResponseException-Klasse

 

Veröffentlicht: Januar 2017

Gilt für: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Verwenden Sie die CrmHttpResponseException-Klasse, um HTTP-Statusfehler, die während der Dynamics 365-Web API-Aufrufen generiert werden, abzubilden. Diese Klasse ist von der Standard-.NET-System-Klasse Exception abgeleitet, um einfach in Ihre vorhandenen Ausnahmebehandlungssmechanismen integriert werden zu können. Allgemeine weitere Informationen finden Sie in Ausnahmen behandeln und auslösend.

Die CrmHttpResponseException-Klasse ist neu in der Exceptions.cs-Datei in der CRM-SDK Web API Hilfe-Bibliothek Er wird ausführlich in den anderen Hilfebibliotheksklassen und den C#-Web-API-Beispielen verwendet. Weitere Informationen finden Sie unter Verwenden Sie die Microsoft Dynamics 365 WEB API Hilfe-Bibliothek (C#).

Diese Klasse verwendet JSON-Zeichenfolgebehandlungsfunktion der Oben-Source Json.NET-Bibliothek.

Klassenmitglieder

Die folgende Tabelle gibt Aufschluss über öffentliche Mitglieder der CrmHttpResponseException-Klasse.

Dynamics 365-Internet API Hilfe-Bibliothek-CrmHttpResponseException-Klassendiagramm

CrmHttpResponseException-Klasse

Eigenschaften:

StackTrace – die Zeichenfolgendarstellung der Zwischen-Frames der Aufrufliste des Dynamics 365-Servers zum Zeitpunkt der Auslösung der Ausnahme (wenn verfügbar).


Methoden:

Die Konstruktoren initialisieren eine Instanz dieser Klasse und erfordern einen HttpContent-Parameter und einen optionalen inneren Ausnahmeparameter.

ExtractMessageFromContent – diese statische Methode extrahiert die Fehlermeldung aus dem angegebenen HTTP-Inhaltsparameter.

Verwendung

Normalerweise erstellen Sie ein CrmHttpResponseException-Objekt und lösen es aus, wenn Sie einen Statusfehler verarbeiten, der mit einer HTTP-Antwort-Nachricht zurückgegeben wird. Der folgende Code löst beispielsweise eine solche Fehlermeldung aus, wenn der WhoAmI Function-Funktionsaufruf fehlschlägt.

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

Sie können die ausgegebenen CrmHttpResponseException-Objekte abfangen und verarbeiten wie bei andere Standard-.NET-Ausnahmen.

Wichtig

Wenn Sie die HttpResponseMessage.EnsureSuccessStatusCode-Methode verwenden, um HTTP-Antwortfehler automatisch in ausgelöste HttpRequestException-Ojekte zu konvertieren, setzt dieser Ansatz die Verwendung der CrmHttpResponseException-Klasse voraus. Beachten Sie, dass, wenn Sie diesen Ansatz nutzen, viele der Antwortnachrichtendetails, einschließlich des Statuscodes, während der Ausnahmebehandlung nicht verfügbar sind.

Klassenlisten

Den aktuellen Code für diese Klasse finden Sie im CRM SDK Web API Helper Library NuGet-Paket.

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

Siehe auch

Erste Schritte mit dem Microsoft Dynamics 365 Web API (C#)
Starten eines Dynamics 365-Web-API-Projekts in Visual Studio (C#)
Verwenden Sie die Microsoft Dynamics 365 WEB API Hilfe-Bibliothek (C#)
Internet-API-Hilfecode: Authentifizierungsklasse
Web API-Hilfecode: Konfigurationsklassen

Microsoft Dynamics 365

© 2017 Microsoft. Alle Rechte vorbehalten. Copyright