Ohjelmointi

Poikkeusten käsittely WCF: ssä

Poikkeuksia ovat virheet, jotka tapahtuvat ajon aikana; poikkeusten käsittely on tekniikka näiden ajonaikaisen virheen käsittelemiseksi. Käytät yleensä sovelluksen koodissa try, catch ja lopuksi lohkoja (tunnetaan myös poikkeuslohkoina) poikkeusten käsittelemiseksi. Jos poikkeuksia ei käsitellä oikein sovelluksen koodissa ja poikkeus on tapahtunut ajon aikana, sovelluksen suorittaminen lopetetaan.

Poikkeusten käsittely WCF: ssä ei ole niin suoraviivaista - sinun on pakko lähettää .Net-objekteja langan kautta, ja WCF-palvelusi voi lähettää asiakkaalle vain sarjamuotoisia tietoja, so. Voit käsitellä WCF: n poikkeuksia yhdellä seuraavista tavoista:

  1. FaultExceptionin käyttäminen
  2. IErrorHandlerin käyttäminen
  3. ReturnUnknownExceptionsAsFaultsin käyttäminen

Tässä viestissä esitän keskustelun eri tavoista, joilla poikkeussanomia voidaan lähettää WCF-palvelusta palvelun kuluttajille.

Harkitse tätä yksinkertaista WCF-palvelua.

[Palvelusopimus]

julkinen käyttöliittymä IDBManagerService

    {

[OperationContract]

void Save (Employee emp);

    }

IDBManagerService-palvelusopimus sisältää yhden toimintosopimuksen työntekijän objektin säilyttämiseksi tietokannassa.

julkisen luokan DBManagerService: IDBManagerService

    {

void Save (työntekijän emp)

        {

yrittää

           {

// Koodi työntekijän objektin tallentamiseksi tietokantaan

           }

saalis (poikkeus ex)

           {

heittää uusi poikkeus ("Virhe tapahtui tallennettaessa tietoja ...");

           }

        }

    }

Oletetaan nyt, että yhteyden muodostamisessa tietokantaan tai työntekijäobjektin tallentamisessa tietokantaan on virhe, kun yrität käyttää palvelua. Sitten saat poikkeuksen tämän viestin kanssa: "System.ServiceModel.FaultException: Palvelin ei voinut käsitellä pyyntöä sisäisen virheen vuoksi. Jos haluat lisätietoja virheestä, kytke joko IncludeExceptionDetailInFaults päälle (joko ServiceBehaviorAttribute-palvelusta tai kokoonpanosta) käyttäytyminen) palvelimella, jotta voidaan lähettää poikkeustiedot takaisin asiakkaalle tai ottaa seuranta käyttöön Microsoft .Net Framework 3.0 SDK -dokumentaation mukaisesti ja tarkistaa palvelimen jäljityslokit. "

Voit asettaa elementin includeExceptionDetailInFaults arvoksi true web.config-tiedostossa siten, että poikkeuksen lisätiedot sisältyvät vikaan, jotta sinulle olisi helpompaa tarkistaa, mikä todella meni pieleen.

Voit saavuttaa tämän myös kirjoittamalla koodin. Tässä on koodinpätkä, joka kuvaa kuinka voit määrittää tämän ominaisuuden tosi.

typeof (ServiceDebugBehavior));

uusi ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Voit myös asettaa tämän arvoksi tosi käyttämällä ServiceBehavior-tagia, kuten alla on esitetty.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

julkisen luokan DBManagerService: IDBManagerService

{

}

Kun yrität käyttää palvelua uudelleen, näet tarkemman poikkeussanoman.

FaultExceptionin käyttäminen

Jos sinun on kuitenkin välitettävä käyttäjäystävällisiä poikkeussanomia palvelusta, sinun tulisi heittää vikapoikkeukset. Vikapoikkeukset ovat poikkeuksia, jotka WCF-palvelu heittää, kun poikkeus tapahtuu ajon aikana - tällaisia ​​poikkeuksia käytetään tyypillisesti lähettämään kirjoittamattomia vikatietoja palvelun kuluttajille. Voit käsitellä poikkeuksia palvelumenetelmissäsi samalla tavalla kuin muillakin tavoilla, ja muuttaa ne sitten vikapoikkeuksiksi.

Alla oleva koodinpätkä näyttää päivitetyn palvelumenetelmän - palvelumenetelmä heittää nyt vian poikkeuksen.

julkisen luokan DBManagerService: IDBManagerService

    {

void Save (työntekijän emp)

        {

yrittää

            {

// Koodi työntekijän objektin tallentamiseksi tietokantaan

            }

saalis (poikkeus ex)

            {

heittää uusi FaultException ("Virhe tapahtui tallennettaessa tietoja ...");

            }

        }

    }

Sinun on nyt käsiteltävä koodisi vikapoikkeus, kun käytät tätä palvelua. Saat lisätietoja vikapoikkeuksista WCF: ssä tästä MSDN-artikkelista.

Voit myös luoda mukautetun vikaluokan, joka on merkitty DataContract-määritteellä.

[DataContract]

julkisen luokan CustomFault

{

[DataMember]

julkinen merkkijono Lähde;

[DataMember]

julkinen merkkijono ExceptionMessage;

[DataMember]

julkinen merkkijono InnerException;

[DataMember]

julkinen merkkijono StackTrace;

}

Seuraava koodinpätkä kuvaa, kuinka voit käyttää CustomFault-luokkaa voimakkaasti kirjoitetun FaultExceptionin heittämiseen.

void Save (Employee emp)

{

yrittää

{

// Koodi työntekijän objektin tallentamiseksi tietokantaan

}

saalis (poikkeus ex)

{

CustomFault cx = uusi CustomFault ();

heittää uusi FaultException (ex, uusi FaultReason ("Tämä on voimakkaasti kirjoitettu viallinen poikkeus"));

}

}

Sinun on myös määritettävä palvelumenetelmääsi varten FaultContract-attribuutti, joka nostaisi FaultExceptionia. Muokattu Tallenna-menetelmä näyttäisi tältä.

[Palvelusopimus]

julkinen käyttöliittymä IDBManagerService

    {

[OperationContract]

[FaultContract]

void Save (Employee emp);

    }

ReturnUnknownExceptionsAsFaultsin käyttäminen

Voit käyttää returnUnknownExceptionsAsFaults-määritettä palvelukäyttäytymisen kokoonpanossa nostaaksesi poikkeuksen SOAP-vikana automaattisesti. Seuraava koodinpätkä kuvaa, miten voit saavuttaa tämän.

returnUnknownExceptionsAsFaults = "True">

Poikkeusten käsittely globaalisti

Toinen tapa käsitellä poikkeuksia WCF: ssä on toteuttaa IErrorHandler-käyttöliittymä palveluluokassa käsittelemään kaikkia poikkeuksia maailmanlaajuisesti ja tarjoamaan SOAP-yhteensopiva FaultException. Tämä käyttöliittymä sisältää kaksi tapaa - HandleError ja ProvideFault. Ensimmäistä käytetään jonkin toiminnon suorittamiseen virheen kanssa, jälkimmäistä käytetään palauttamaan vikailmoitus. Huomaa, että voit myös määrittää IErrorHandlerin (kytkeä sen päälle tai pois päältä) palvelun konfiguroitavassa tiedostossa.

$config[zx-auto] not found$config[zx-overlay] not found