2009-01-15 6 views
3

Je suis en train de m'intégrer à MS Dynamics GP WebServices de C# et je ne sais pas comment gérer les exceptions.Exception générique sur les services Web

Si je crée un GetCustomer avec un ID inexistant, les services Web me renvoient une exception SoapException "générique" et le message est "Objet métier introuvable". Donc, la seule façon dont je vois pour être sûr que c'est un identifiant invalide et pas une autre erreur, c'est en analysant le message d'erreur, je trouve cette solution extrêmement fragile. Ma version GP est en anglais, sur le site du client, ça va être en français et je n'ai aucune idée du message que les services web vont avoir. Je pense à l'attraper, à analyser le message et à lancer un type d'erreur plus significatif.

Voyez-vous une meilleure option?

Répondre

0

Contrôlez-vous le code WebService?

Dans ce cas, je retournerais SoapExceptions avec des codes d'erreur simples qui sont plus faciles à analyser et laisser l'application cliente décider du message à afficher et du code d'erreur analysé.

Vous pouvez utiliser un enum "Codes d'erreur" sur le WebService pour rendre le code plus lisible.

//Example 
enum ErrorCodes 
{ 
    BusinessObjectNotFound = 1000, 
    AnotherPossibleError = 1002 
} 

try 
{ 
//Code 
} 
Catch(BusinessObjectNotFoundException bex) 
{ 
    throw new SoapException(ErrorCodes.BusinessObjectNotFound); 
    //Or maybe... 
    //throw new SoapException(((int)ErrorCodes.BusinessObjectNotFound).ToString()); 
} 
+0

non ce l'erreur Dynamics GP jette sur moi. – pmlarocque

1

Malheureusement à la fois l'API eConnect et les services Web GP renvoient les deux erreurs génériques, juste être heureux que vous ne devez pas analyser les eConnect. Les bonnes choses sont, les erreurs sont généralement statiques, de sorte que vous pouvez construire des parseurs pour eux. Créer des exceptions personnalisées est certainement un bon moyen de le faire avec ce type de service Web.

+0

Merci, oui, je suis heureux de voir que tous les services que je avais besoin étaient disponibles via des services Web ou j'aurais piège avec eConnect. – pmlarocque

+0

eConnect est une douleur, non pour mentionner les coûts supplémentaires pour le client, nous l'utilisons avec une dizaine de clients différents et la seule bonne chose à propos d'eConnect est de savoir comment verbeux les erreurs sont, et vous pouvez toujours obtenir les erreurs eConnect dans l'observateur d'événements. –

1

J'ai a blog post qui détaille comment j'ai surmonté cette question dans WCF (bien que vous pouvez voir, cela ne me dérange pas d'analyser le message d'erreur pour obtenir les détails). Voici la viande de celui-ci:

catch (FaultException soapEx) 
{ 
    MessageFault mf = soapEx.CreateMessageFault(); 
    if (mf.HasDetail) 
    { 
     XmlDictionaryReader reader = mf.GetReaderAtDetailContents(); 
     Guid g = reader.ReadContentAsGuid(); 
    } 
} 

Une fois que vous avez le GUID vous pouvez l'utiliser pour interroger le service Web GP pour les détails de l'erreur.

+0

Merci d'enquêter. – pmlarocque

+0

La méthode de service Web que vous souhaitez pour les détails est GetLoggedValidationResultByKey (qui renvoie un objet résultat utile). –

+0

C'est un pas dans la bonne direction mais ça ne marche pas. En GP aide. Je dis d'obtenir le Guid nécessaire par "GetLoggedValidationResultByKey" de "soapErr.Detail.InnerText" et dans le cas de "GetCustomerByKey" est une clé non valide, cette propriété est vide .... Je vais juste analyser l'erreur pour l'instant je pense . – pmlarocque

0

Pour les personnes intéressées par les sujets abordés, la réponse de Jacob Proffitt semble être la bonne voie. ici un snipper de Dynamics GP Documentation:

catch(SoapException soapErr) 
{ 
    // If a validation exception occurred, the logid will be in a child node 
    if(soapErr.Detail.HasChildNodes == true) 
    { 
     // Create a guid for the logid value in the soap exception 
     Guid guid = new Guid(soapErr.Detail.InnerText); 

     // Get the validation result object 
     validationResult = wsDynamicsGP.GetLoggedValidationResultByKey(guid, context); 

     // Display the number of validation exceptions 
     MessageBox.Show("Number of validation exceptions: " + 
     validationResult.Errors.Length.ToString()); 
    } 

}

Mais dans le cas où je citais: GetCustomer avec un ID unexisting, la ligne "soapErr.Detail.HasChildNodes" est faux si elle échoue. ..

Les webservices semblent plein de comportement drôle, cela prendra plus longtemps que prévu :(

0

Je commence à détester GP Cela peut être « mauvaise forme », mais voici ce que je faisais:

try 
{ 
    // query service for object by key 
} 
catch (System.ServiceModel.FaultException e) 
{ 
    if (e.Message == "Business object not found.") 
    { 
     // create new object 
    } 
    else 
    { 
     // log the exception appropriately 
    } 
} 
Questions connexes