Partilhar via


Código auxiliar de API da Web: classe CrmHttpResponseException

 

Publicado: janeiro de 2017

Aplicável a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Use a classe CrmHttpResponseException para representar Erros de status HTTP gerados durante as chamadas à API Web do Dynamics 365. Esta classe é derivada da classe padrão .NET System.Exception para se integrar com facilidade aos seus mecanismos de manipulação de exceções existente. Para obter informações mais gerais, consulte Manipulando e gerando exceções.

A classe CrmHttpResponseException está localizada no arquivo Exceptions.cs na Biblioteca Auxiliar da API Web do SDK do CRM. Ela é usada extensivamente nas outras classes de biblioteca auxiliar e nos exemplos da API Web C#. Para obter mais informações, consulte Use a Microsoft Dynamics 365 Biblioteca Auxiliar da API Web (C#).

Esta classe usa a funcionalidade de manipulação de cadeias de caracteres JSON da biblioteca de software livre Json.NET.

Membros de classe

A seguinte tabela mostra os membros públicos da classe CrmHttpResponseException.

Biblioteca Auxiliar da API Web do Dynamics 365-Diagrama de Classe de CrmHttpResponseException

Classe CrmHttpResponseException

Propriedades:

StackTrace – a representação de cadeia de caracteres dos quadros imediatos na pilha de chamadas do Dynamics 365 quando a exceção foi gerada, se disponível.


Métodos:

Os construtores inicializam uma instância dessa classe e exigem um parâmetro HttpContent e um parâmetro de exceção interno opcional.

ExtractMessageFromContent – esse método estático extrai a mensagem de erro do parâmetro de conteúdo HTTP especificado.

Uso

Normalmente, você cria e gera um objeto CrmHttpResponseException ao processar um erro de status retornado com uma mensagem de resposta HTTP. Por exemplo, o código a seguir gera um erro desses quando a chamada à função WhoAmI Function falha.

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

Você pode capturar e processar objetos CrmHttpResponseException gerados de forma semelhante a outras exceções padrão do .NET.

Importante

Se você estiver usando o método HttpResponseMessage.EnsureSuccessStatusCode para converter automaticamente os erros de resposta HTTP em objetos HttpRequestException gerados, essa abordagem impede o uso da classe CrmHttpResponseException. Observe que se você usar essa abordagem, muitos dos detalhes da mensagem de resposta, incluindo o código de status, não estarão disponíveis durante a manipulação da exceção.

Listagem de classes

A origem mais atual dessa classe se encontra no pacote NuGet Biblioteca Auxiliar da API Web do SDK do 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
        }
    }
}

Confira Também

Introdução à API Web do Microsoft Dynamics 365 (C#)
Iniciar um projeto de API Web do Dynamics 365 no Visual Studio (C#)
Use a Microsoft Dynamics 365 Biblioteca Auxiliar da API Web (C#)
Código auxiliar de API da Web: classe de autenticação
Código auxiliar de API da Web: Classes de configuração

Microsoft Dynamics 365

© 2017 Microsoft. Todos os direitos reservados. Direitos autorais