Προγραμματισμός

Χειρισμός εξαίρεσης στο WCF

Εξαιρέσεις είναι σφάλματα που εμφανίζονται κατά το χρόνο εκτέλεσης. Εξαίρεση χειρισμός είναι η τεχνική χειρισμού αυτών των σφαλμάτων χρόνου εκτέλεσης. Συνήθως θα χρησιμοποιούσατε δοκιμές, πιάσεις και τελικά μπλοκ (γνωστές και ως μπλοκ εξαίρεσης) στον κώδικα της εφαρμογής σας για τον χειρισμό εξαιρέσεων. Εάν οι εξαιρέσεις δεν αντιμετωπιστούν σωστά στον κώδικα της εφαρμογής και έχει προκύψει εξαίρεση κατά το χρόνο εκτέλεσης, η εκτέλεση της εφαρμογής θα τερματιστεί.

Ο χειρισμός της εξαίρεσης στο WCF δεν είναι τόσο απλός - είστε περιορισμένοι στην αποστολή. Τα καθαρά αντικείμενα μέσω του καλωδίου και η υπηρεσία WCF σας μπορεί να στέλνει μόνο σειριακά δεδομένα, δηλαδή μηνύματα SOAP στον πελάτη. Μπορείτε να χειριστείτε εξαιρέσεις στο WCF με έναν από αυτούς τους τρεις τρόπους:

  1. Χρησιμοποιώντας FaultException
  2. Χρήση του IErrorHandler
  3. Χρήση του ReturnUnknownExceptionsAsFaults

Σε αυτήν την ανάρτηση, θα παρουσιάσω μια συζήτηση για τους διάφορους τρόπους με τους οποίους μπορούν να μεταδοθούν μηνύματα εξαίρεσης από την υπηρεσία WCF στους καταναλωτές της υπηρεσίας.

Σκεφτείτε αυτήν την απλή υπηρεσία WCF.

[ServiceContract]

δημόσια διεπαφή IDBManagerService

    {

[OperationContract]

void Save (Εργαζόμενος emp);

    }

Το συμβόλαιο υπηρεσίας IDBManagerService περιέχει ένα συμβόλαιο λειτουργίας για να διατηρήσει ένα αντικείμενο υπαλλήλου στη βάση δεδομένων.

δημόσια κλάση DBManagerService: IDBManagerService

    {

void Save (Εργαζόμενος emp)

        {

δοκιμάστε

           {

// Κωδικός για την αποθήκευση ενός αντικειμένου υπαλλήλου στη βάση δεδομένων

           }

αλίευση (πρώην εξαίρεση)

           {

ρίξτε νέα εξαίρεση ("Παρουσιάστηκε σφάλμα κατά την αποθήκευση δεδομένων ...").

           }

        }

    }

Ας υποθέσουμε τώρα ότι υπάρχει σφάλμα κατά τη σύνδεση στη βάση δεδομένων ή την αποθήκευση του αντικειμένου υπαλλήλου στη βάση δεδομένων τη στιγμή που προσπαθείτε να καταναλώσετε την υπηρεσία. Στη συνέχεια, θα λάβετε μια εξαίρεση με αυτό το μήνυμα: "System.ServiceModel.FaultException: Ο διακομιστής δεν μπόρεσε να επεξεργαστεί το αίτημα λόγω εσωτερικού σφάλματος. Για περισσότερες πληροφορίες σχετικά με το σφάλμα, ενεργοποιήστε το IncludeExceptionDetailInFaults (είτε από το ServiceBehaviorAttribute είτε από τη διαμόρφωση συμπεριφορά) στο διακομιστή για να στείλετε τις πληροφορίες εξαίρεσης στον πελάτη ή να ενεργοποιήσετε την ανίχνευση σύμφωνα με την τεκμηρίωση του Microsoft .Net Framework 3.0 SDK και να ελέγξετε τα αρχεία καταγραφής ανίχνευσης διακομιστή. "

Μπορείτε να χρησιμοποιήσετε ορίστε το στοιχείο includeExceptionDetailInFaults σε πραγματικό στο αρχείο web.config, έτσι ώστε οι πρόσθετες λεπτομέρειες της εξαίρεσης να περιλαμβάνονται στο σφάλμα για να είναι πιο βολικό για εσάς να ελέγξετε τι πραγματικά πήγε στραβά.

Μπορείτε επίσης να το επιτύχετε γράφοντας κώδικα. Ακολουθεί ένα απόσπασμα κώδικα που δείχνει πώς μπορείτε να ορίσετε αυτήν την ιδιότητα σε true.

typeof (ServiceDebugBehavior));

νέο ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Μπορείτε επίσης να το ορίσετε σε πραγματικό χρησιμοποιώντας την ετικέτα ServiceBehavior όπως φαίνεται παρακάτω.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

δημόσια κλάση DBManagerService: IDBManagerService

{

}

Όταν προσπαθείτε να καταναλώσετε ξανά την υπηρεσία, θα δείτε ένα πιο ακριβές μήνυμα εξαίρεσης.

Χρησιμοποιώντας FaultException

Ωστόσο, εάν πρέπει να διαβιβάσετε φιλικά προς το χρήστη μηνύματα εξαίρεσης από την υπηρεσία, θα πρέπει να ρίξετε εξαιρέσεις σφαλμάτων Οι εξαιρέσεις σφαλμάτων είναι εξαιρέσεις που ρίχνονται από μια υπηρεσία WCF όταν συμβαίνει μια εξαίρεση κατά το χρόνο εκτέλεσης - τέτοιες εξαιρέσεις χρησιμοποιούνται συνήθως για τη μετάδοση μη τυποποιημένων δεδομένων σφάλματος στους καταναλωτές υπηρεσιών. Μπορείτε να χειριστείτε εξαιρέσεις στις μεθόδους υπηρεσίας σας με τον ίδιο τρόπο που κάνετε με άλλες μεθόδους και στη συνέχεια να τις μετατρέψετε σε εξαιρέσεις σφάλματος.

Το απόσπασμα κώδικα που ακολουθεί δείχνει την ενημερωμένη μέθοδο υπηρεσίας - η μέθοδος υπηρεσίας τώρα δημιουργεί εξαίρεση σφάλματος.

δημόσια κλάση DBManagerService: IDBManagerService

    {

void Save (Εργαζόμενος emp)

        {

δοκιμάστε

            {

// Κωδικός για την αποθήκευση ενός αντικειμένου υπαλλήλου στη βάση δεδομένων

            }

αλίευση (πρώην εξαίρεση)

            {

ρίξτε νέο FaultException ("Παρουσιάστηκε σφάλμα κατά την αποθήκευση δεδομένων ...").

            }

        }

    }

Τώρα θα πρέπει να χειριστείτε την εξαίρεση σφάλματος στον κωδικό σας κατά την κατανάλωση αυτής της υπηρεσίας. Μπορείτε να μάθετε περισσότερα σχετικά με τις εξαιρέσεις σφαλμάτων στο WCF από αυτό το άρθρο MSDN.

Μπορείτε επίσης να δημιουργήσετε μια προσαρμοσμένη κλάση σφάλματος που επισημαίνεται με το χαρακτηριστικό DataContract.

[DataContract]

δημόσια τάξη CustomFault

{

[Μέλος δεδομένων]

δημόσια συμβολοσειρά Πηγή;

[Μέλος δεδομένων]

δημόσια συμβολοσειρά ExceptionMessage;

[Μέλος δεδομένων]

δημόσια συμβολοσειρά InnerException;

[Μέλος δεδομένων]

δημόσια συμβολοσειρά StackTrace;

}

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να χρησιμοποιήσετε την κλάση CustomFault για να ρίξετε έντονα δακτυλογραφημένο FaultException.

void Save (Εργαζόμενος emp)

{

δοκιμάστε

{

// Κωδικός για να αποθηκεύσετε το αντικείμενο του εργαζομένου στη βάση δεδομένων

}

αλίευση (πρώην εξαίρεση)

{

CustomFault cx = νέο CustomFault ();

ρίξτε νέο FaultException (πρώην, νέο FaultReason ("Πρόκειται για μια εξαίρεση με έντονη πληκτρολόγηση"));

}

}

Θα πρέπει επίσης να καθορίσετε το χαρακτηριστικό FaultContract στη μέθοδο υπηρεσίας που θα αυξήσει το FaultException. Η τροποποιημένη μέθοδος αποθήκευσης θα μοιάζει με αυτήν.

[ServiceContract]

δημόσια διεπαφή IDBManagerService

    {

[OperationContract]

[FaultContract]

void Save (Εργαζόμενος emp);

    }

Χρήση του ReturnUnknownExceptionsAsFaults

Μπορείτε να χρησιμοποιήσετε το χαρακτηριστικό returnUnknownExceptionsAsFaults στη διαμόρφωση συμπεριφοράς υπηρεσίας για να αυξήσετε αυτόματα μια εξαίρεση ως σφάλμα SOAP. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να το επιτύχετε.

returnUnknownExceptionsAsFaults = "True">

Χειρισμός εξαιρέσεων παγκοσμίως

Ένας άλλος τρόπος για να χειριστείτε εξαιρέσεις στο WCF είναι να εφαρμόσετε τη διεπαφή IErrorHandler στην κατηγορία υπηρεσιών σας για να χειριστείτε όλες τις εξαιρέσεις παγκοσμίως και να παρέχετε ένα FaultException συμβατό με το SOAP. Αυτή η διεπαφή περιέχει δύο μεθόδους - το HandleError και το ProvFault. Ενώ το πρώτο χρησιμοποιείται για να εκτελέσει κάποια δραστηριότητα με το σφάλμα, το δεύτερο χρησιμοποιείται για την επιστροφή ενός μηνύματος σφάλματος. Σημειώστε ότι μπορείτε επίσης να διαμορφώσετε το IErrorHandler (να το ενεργοποιήσετε ή να το απενεργοποιήσετε) στο αρχείο με δυνατότητα διαμόρφωσης της υπηρεσίας.