2010-09-21 6 views
3

J'ai un service web C# que j'appelle en utilisant jquery ajax. Cela fonctionne correctement, sauf lorsqu'une exception personnalisée est lancée dans la méthode Web. Pour une raison quelconque, les objets XmlHttpResponse responseText possèdent uniquement les propriétés de la classe Exception de base. Je me retrouve donc avec un objet json avec les propriétés suivantes: "ExceptionType", "Message" et "StackTrace"Comment sérialiser une exception personnalisée à json dans C#

Mon exception personnalisée a une propriété appelée "FieldErrors" qui n'apparaît pas dans la déclaration. Voici le code de cette classe:

[Serializable] 
[XmlRootAttribute(Namespace = "http://www.mydomain.com/", IsNullable = false)] 
public class ValidationException : Exception 
{ 
    public List<string> FieldErrors { get; set; } 
    public ValidationException(string message = null, Exception innerException = null) : base(message: message, innerException: innerException) 
    { 
     this.FieldErrors = new List<string>(); 
    } 
} 

Mon but est d'obtenir la propriété « FieldErrors » pour apparaître dans la réponse JSON.

+0

Je n'ai jamais travaillé avec les trucs JSON, mais cela aide-t-il si vous utilisez une 'SoapException'? –

+0

Bonjour. Il semble que le SoapException n'aide pas :(. Je ne vois toujours pas la propriété personnalisée – fehays

Répondre

3

Ne faites pas cela. Vous ne devriez jamais exposer des exceptions de votre site asp.net.

Même s'il finira caché à l'utilisateur, vous l'envoyez toujours avec tous ses détails au client.

Dans ce cas, vous voulez réellement contrôler ce qui sera envoyé, donc envoyer explicitement la liste des erreurs de champ sans envoyer la version json de l'instance d'exception entière est ce que vous devriez faire de toute façon.

+0

Merci Bonne suggestion Je voudrais quand même savoir comment le faire, ce qui soulève une autre question, comment puis-je retourner la liste? des erreurs de champ et être capable de gérer cela dans le rappel "erreur" ajax? Dois-je manuellement définir le code de réponse à 500 avant de retourner les erreurs – fehays

+0

oui, vous définissez le code de réponse à 500 pour indiquer une erreur à l'appelant. Quelque chose d'assez différent/improbable mais je veux ajouter: si vous décryptez quelque chose dans la requête, assurez-vous que la réponse est exactement la même quand l'API ne décrypte pas (à cause du rembourrage) La valeur décryptée est garbage.Tout est la vulnérabilité de l'oracle padding.Aussi, si c'est le cas, il est préférable d'ajouter une signature. – eglasius

Questions connexes