2008-09-16 9 views
1

J'ai lu ce thread pour WCF a intégré des codes de défaut personnalisés et d'autres choses.Code d'erreur ou Exception - quelle est la meilleure pratique pour un service Web ASP.Net?

Mais quelle est la meilleure pratique pour les services Web ASP.Net. Est-ce que je lance des exceptions et que le client gère l'exception ou envoie un code d'erreur (succès, échec, etc.) sur lequel le client s'appuierait pour effectuer son traitement.

Mise à jour: Pour discuter plus en détail de SOAP, disons que le client fait un appel websvc qui est censé être un message de notification (aucune valeur de retour attendue), donc tout se passe sans aucune exception. .

Maintenant comment le client saura-t-il si l'appel de notification a été perdu en raison d'un problème de communication/réseau ou quelque chose entre le serveur et le client? comparez cela à ne pas avoir d'exception levée. Le client pourrait supposer que c'est un succès. Mais ce n'est pas. L'appel s'est perdu quelque part. L'envoi d'un code d'erreur 'succès' assure-t-il au client que l'appel s'est déroulé sans problème? existe-t-il un autre moyen d'y parvenir ou le scénario ci-dessus est-il même possible?

Répondre

2

Jeff Atwood a posté an interesting aerticle à propos de ce sujet il y a un certain temps. Bien qu'une exception .NET soit convertie en SoapFault, ce qui est compatible avec la plupart des autres toolkits, l'information dans les failles n'est pas très bonne. À cet effet, la conlusion de l'article est que webservices .NET ne jettent pas les messages très bien d'exception et vous devez ajouter des informations supplémentaires:

Private Sub WebServiceExceptionHandler(ByVal ex As Exception) 
    Dim ueh As New AspUnhandledExceptionHandler 
    ueh.HandleException(ex) 

    '-- Build the detail element of the SOAP fault. 
    Dim doc As New System.Xml.XmlDocument 
    Dim node As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _ 
     SoapException.DetailElementName.Name, _ 
     SoapException.DetailElementName.Namespace) 

    '-- append our error detail string to the SOAP detail element 
    Dim details As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _ 
     "ExceptionInfo", _ 
     SoapException.DetailElementName.Namespace) 
    details.InnerText = ueh.ExceptionToString(ex) 
    node.AppendChild(details) 

    '-- re-throw the exception so we can package additional info 
    Throw New SoapException("Unhandled Exception: " & ex.Message, _ 
     SoapException.ClientFaultCode, _ 
     Context.Request.Url.ToString, node) 
End Sub 

Plus d'info pourquoi soapfaults sont mieux in this question.

1

Dépend de la façon dont vous allez consommer le service Web, c'est-à-dire le protocole que vous allez utiliser. Si c'est GET ou POST, mieux vaut renvoyer le code d'erreur, car le HttpWebRequest appelant (.Net) ou un autre code recevra une erreur de serveur, et devra en traiter pour extraire le code d'exception. Si c'est SOAP - alors il est parfaitement possible de lancer des exceptions personnalisées (vous ne voulez pas renvoyer d'exceptions de cadre interne, car elles peuvent révéler une trace de pile, etc. à des parties externes). Etant donné que les services Web SOAP doivent être considérés comme un appel de méthode normal, l'infrastructure d'appel correspondante doit être capable de gérer et de propager l'exception, ce qui permet au code appelant de se comporter et de se comporter correctement. traite des appels internes.

+0

Je voudrais vraiment savoir pourquoi cela a été voté? C'est complètement pertinent. –

Questions connexes