2009-04-21 4 views
1

J'utilise des méthodes avec l'attribut [WebMethod] dans mes pages aspx. Je n'utilise pas asp.net ajax mais jQuery pour appeler ces méthodes et retourner des objets dans JSON. Tout cela fonctionne très bien.Masquage de la pile pour une exception renvoyée par une méthode web asp.net?

Ensuite, j'ai ajouté une vérification d'autorisation dans webMethod, si l'utilisateur actuel n'a pas accès à la fonctionnalité dont j'ai besoin pour que le JavaScript appelant sache. Par conséquent, je lève une exception AccessViolationException qui peut ensuite être analysée par la fonction de rappel OnError dans JavaScript. Cela fonctionne aussi mais l'exception inclut le StackTrace complet et je ne veux pas le rendre disponible au client appelant.

De quelles autres manières pourrais-je utiliser pour renvoyer un "Accès refusé" au client lorsque WebMethod renvoie un objet métier?

J'utilise ASP.Net 3.5SP1 et jQuery 1,32

Répondre

2

Pourquoi propager des erreurs à travers le fil? Pourquoi ne pas utiliser une réponse d'erreur? Enveloppez simplement votre objet dans un objet de réponse pouvant contenir un code d'erreur pour l'état et un message d'erreur à présenter aux utilisateurs.

+0

Je pense J'ai très peu de contrôle sur la valeur de retour d'un WebMethod, je peux soit retourner l'objet métier attendu ou null. Comment est-ce que je jetterais une «réponse d'erreur» là? –

+0

Vous pouvez encapsuler votre BusinessObject dans un objet ResponseObject qui pourrait avoir un statut. Ne pourriez-vous pas? –

+0

Je pensais juste dans le même sens, merci pour l'entrée. –

0

Je garde des exceptions pour quand les choses vont vraiment mal. (par exemple, impossible de se connecter à la base de données)

Renvoyez rien (null/nill/whatever) ou renvoyez une valeur false false. Désolé, je n'ai pas une meilleure réponse que ça ... Je vais devoir continuer à me regarder moi-même.

0

Vous pouvez regarder SoapException: http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapexception(VS.71).aspx

Je ne suis pas sûr, si cela va fonctionner quand il est appelé à partir de JavaScript. Surtout si ça s'appelle avec une get-request. BTW AccessViolationException est ma meilleure connaissance à lancer lorsque l'application accède à de la mémoire à laquelle elle n'a pas accès.

/Asger

+0

Il n'y a pas de savon impliqué ici, pur HTTP et JSON. Mais vous avez raison le AccessViolationException était le mauvais choix pour une exception. –

1

Comme suggéré par NunFur j'ai changé mon approche et plutôt que de jeter une erreur, je retourne un objet « plus riche ».

Il existe au moins deux options, la première étant d'encapsuler mon objet métier dans un objet de réponse avec certaines propriétés de statut. J'ai essayé ceci mais cela rend le JSON plus compliqué. Donc plutôt que d'ajouter un nouvel objet j'ai ajouté deux propriétés à mon objet métier, quelque chose comme ServiceStatus et ServiceMessage. Par défaut, ils sont 200 et '', mais peuvent être définis par le code WebMethod si quelque chose ne va pas (pas d'accès, erreur correcte). Dans ce cas, l'objet métier sera "vide" (aucune donnée). Le code JavaScript vérifie ensuite le ServiceStatus et réagit de manière appropriée.

J'ajoute les deux champs à tous mes objets qui sont retournés par WebMethods, même une simple chaîne. Ils doivent implémenter une interface avec ces deux propriétés.

Maintenant, j'ai un contrôle complet sur ce qui se passe sur le fil au cas où quelque chose d'inattendu se passe.

Merci pour l'entrée

1

Vous pouvez également ajouter un:

customErrors mode="On"/ 

dans votre web.config, cela couper la trace de la pile et vous laisser seulement le message d'exception