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