Olá pessoal,
Estamos bem acostumados com o tratamento e lançamento de exceções no Dynamics 365, porém existe alguns tipos de erros que não são lançados automaticamente. Mais especificamente estou me referindo a classe de conexão CrmServiceClient, que utilizamos para fazer uma Conexão Simplificada (Simplified Connection) através do XrmTooling.
Geralmente este tipo de exceção na conexão deve-se ao fato de algum erro de digitação da String de Conexão (Connection String) ou por problemas de comunicação entre o Dynamics e a aplicação que está tentando a conexão.
O motivo da falta de exceções não é bem claro, mas um colega de trabalho deu uma boa razão, talvez não seja possível lançar a exceção pois outras classes e métodos ainda precisam ser processados, deste modo, armazenam a exceção para que nós mesmos possamos lança-la ou tratá-la mais tarde.
A boa notícia é que é realmente algo bem simples para tratarmos, existem três propriedades da classe CrmServiceClient para nos ajudar:
- IsReady (boolean) – informa se a conexão estão pronta, ou seja, caso o valor seja FALSE, NÃO podemos consultar o web service do Dynamics
- LastCrmError (string) – contém a descrição do último erro encontrado
- LastCrmException (Exception) – contém o objeto de exceção do último erro (*Vale a menção de que em todos os testes que realizei, não consegui encontrar valores nesta propriedade, assim, verifique se está diferente de NULL)
Abaixo, minha adaptação do código provido pelo SDK com as mudanças para capturar erros de conexão está destacado:
IOrganizationService _orgService = null; private IOrganizationService GetConn(string connectionString) { try { CrmServiceClient conn = null; if (_orgService == null) { if (string.IsNullOrEmpty(connectionString)) { // Obtain connection configuration information for the Microsoft Dynamics // CRM organization web service. connectionString = GetServiceConfiguration(); } if (connectionString != null) { // Connect to the CRM web service using a connection string. conn = new CrmServiceClient(connectionString); // Cast the proxy client to the IOrganizationService interface. _orgService = (IOrganizationService)conn.OrganizationWebProxyClient != null ? (IOrganizationService)conn.OrganizationWebProxyClient : (IOrganizationService)conn.OrganizationServiceProxy; } } // *** Start - Connection is NOT READY (there is an error) *** // Check if the connection is NOT Ready and throw an exception if (!conn.IsReady) { // TO DO: Check if conn.LastCrmException has value to show the proper exception throw new Exception(string.Concat("Error while trying to connect to CRM!\nDescription: ", conn.LastCrmError)); } // *** End - Connection is NOT READY (there is an error) *** } catch (FaultException<OrganizationServiceFault> ex) { throw new Exception(string.Concat("The application terminated with an error.", "Timestamp: {0}", ex.Detail.Timestamp, "Code: {0}", ex.Detail.ErrorCode, "Message: {0}", ex.Detail.Message, "Trace: {0}", ex.Detail.TraceText, "Inner Fault: {0}", null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault")); } catch (TimeoutException ex) { throw new Exception(string.Concat("The application terminated with an error.", "Message: {0}", ex.Message, "Stack Trace: {0}", ex.StackTrace, "Inner Fault: {0}", null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message)); } catch (Exception ex) { string exception = string.Empty; exception = string.Concat("The application terminated with an error.\n", ex.Message, "\n"); // Display the details of the inner exception. if (ex.InnerException != null) { exception += string.Concat(ex.InnerException.Message, "\n"); FaultException<OrganizationServiceFault> fe = ex.InnerException as FaultException<OrganizationServiceFault>; if (fe != null) { exception += string.Concat("Timestamp: {0}", fe.Detail.Timestamp); exception += string.Concat("Code: {0}", fe.Detail.ErrorCode); exception += string.Concat("Message: {0}", fe.Detail.Message); exception += string.Concat("Trace: {0}", fe.Detail.TraceText); exception += string.Concat("Inner Fault: {0}", null == fe.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault"); } } throw new Exception(exception); } return _orgService; }
Bom, este post termina aqui, espero ajudar!
[]’s,
Tiago