Programavimas

Išimčių tvarkymas WCF

Išimtys yra klaidos, atsirandančios vykdymo metu; išimčių tvarkymas yra šių vykdymo laiko klaidų valdymo technika. Norėdami tvarkyti išimtis, savo programos kode paprastai naudosite „try, catch“ ir galiausiai blokus (dar vadinamus išimčių blokais). Jei išimtys nėra tinkamai tvarkomos programos kode ir išimtis įvyko vykdymo metu, programos vykdymas bus nutrauktas.

Išimčių tvarkymas WCF nėra toks tiesus - jūs privalote siųsti .Net objektus per laidą, o jūsų WCF tarnyba klientui gali siųsti tik serijinius duomenis, t. Y. SOAP pranešimus. Išimtis WCF galite tvarkyti vienu iš šių trijų būdų:

  1. Naudojant „FaultException“
  2. Naudojant „IErrorHandler“
  3. Naudojant returnUnknownExceptionsAsFaults

Šiame pranešime pateiksiu diskusiją apie įvairius išimčių pranešimų iš WCF tarnybos perdavimo paslaugos vartotojams būdus.

Apsvarstykite šią paprastą WCF paslaugą.

[„ServiceContract“]

viešoji sąsaja IDBManagerService

    {

[OperationContract]

anuliuoti „Išsaugoti“ („Employee emp“);

    }

„IDBManagerService“ paslaugų sutartyje yra viena operacijos sutartis, skirta išlaikyti darbuotojo objektą duomenų bazėje.

viešosios klasės DBManagerService: IDBManagerService

    {

void Išsaugoti (darbuotojo įgaliojimas)

        {

bandyti

           {

// Kodas, skirtas saugoti darbuotojo objektą duomenų bazėje

           }

sugavimas (ex išimtis)

           {

mesti naują išimtį („Klaida įvyko išsaugant duomenis ...“);

           }

        }

    }

Dabar tarkime, kad bandant naudotis paslauga įvyko klaida prisijungiant prie duomenų bazės arba saugant darbuotojo objektą duomenų bazėje. Tada gausite šio pranešimo išimtį: "System.ServiceModel.FaultException: serveris negalėjo apdoroti užklausos dėl vidinės klaidos. Norėdami gauti daugiau informacijos apie klaidą, įjunkite IncludeExceptionDetailInFaults (arba iš ServiceBehaviorAttribute, arba iš konfigūracijos elgesį) serveryje, norėdami išsiųsti informaciją apie išimtis klientui arba įjungti sekimą pagal „Microsoft .Net Framework 3.0“ SDK dokumentaciją ir patikrinti serverio pėdsakų žurnalus. "

Galite naudoti elemento „includeExceptionDetailInFaults“ nustatymą į „true“ faile web.config, kad papildoma išsami informacija apie išimtį būtų įtraukta į gedimą, kad jums būtų patogiau patikrinti, kas iš tikrųjų nutiko.

Tai galite pasiekti ir parašę kodą. Čia yra kodo fragmentas, parodantis, kaip šią nuosavybę galite nustatyti kaip teisingą.

typeof (ServiceDebugBehavior));

naujas „ServiceDebugBehavior“ {IncludeExceptionDetailInFaults = true});

Taip pat galite tai nustatyti kaip „true“ naudodami „ServiceBehavior“ žymą, kaip parodyta žemiau.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

viešosios klasės DBManagerService: IDBManagerService

{

}

Kai bandysite vėl naudotis paslauga, pamatysite tikslesnį išimties pranešimą.

Naudojant „FaultException“

Tačiau jei jums reikia perduoti patogias išimties žinutes iš paslaugos, turėtumėte atmesti klaidų išimtis. Klaidų išimtys yra išimtys, kurias numato WCF tarnyba, kai išimtis įvyksta vykdymo metu - tokios išimtys paprastai naudojamos perduodant nenurodytus gedimų duomenis paslaugos vartotojams. Aptarnaujančių paslaugų metodų išimtis galite tvarkyti taip pat, kaip ir kitus metodus, ir tada paversti jas gedimų išimtimis.

Žemiau pateiktas kodo fragmentas rodo atnaujintą aptarnavimo metodą - paslaugų metodas dabar išmeta gedimo išimtį.

viešosios klasės DBManagerService: IDBManagerService

    {

void Išsaugoti (darbuotojo įgaliojimas)

        {

bandyti

            {

// Kodas, skirtas saugoti darbuotojo objektą duomenų bazėje

            }

sugavimas (ex išimtis)

            {

mesti naują „FaultException“ („Klaida įvyko išsaugant duomenis ...“);

            }

        }

    }

Dabar, kai naudojatės šia paslauga, turėsite tvarkyti klaidos išimtį savo kode. Iš šio MSDN straipsnio galite sužinoti daugiau apie klaidų išimtis WCF.

Taip pat galite sukurti pasirinktinę gedimų klasę, pažymėtą „DataContract“ atributu.

[Duomenų sutartis]

viešosios klasės „CustomFault“

{

[DataMember]

vieša eilutė Šaltinis;

[DataMember]

vieša eilutė „ExceptionMessage“;

[DataMember]

viešoji eilutė „InnerException“;

[DataMember]

viešoji eilutė „StackTrace“;

}

Šis kodo fragmentas iliustruoja, kaip galite naudoti „CustomFault“ klasę, norėdami mesti griežtai įvestą „FaultException“.

void Išsaugoti (darbuotojo įgaliojimas)

{

bandyti

{

// Kodas išsaugoti darbuotojo objektą duomenų bazėje

}

sugavimas (ex išimtis)

{

CustomFault cx = new CustomFault ();

mesti naują „FaultException“ (pvz., naują „FaultReason“ („Tai yra labai tipiškai sugadinta išimtis“));

}

}

Taip pat turėtumėte nurodyti „FaultContract“ atributą savo paslaugų metode, kuris padidintų „FaultException“. Pakeistas išsaugojimo metodas atrodys taip.

[„ServiceContract“]

viešoji sąsaja IDBManagerService

    {

[OperationContract]

[FaultContract]

anuliuoti „Išsaugoti“ („Employee emp“);

    }

Naudojant returnUnknownExceptionsAsFaults

Norėdami naudoti išimtį kaip SOAP gedimą, galite naudoti paslaugos elgesio konfigūracijos atributą returnUnknownExceptionsAsFaults. Šis kodo fragmentas parodo, kaip galite tai pasiekti.

returnUnknownExceptionsAsFaults = "True">

Išimčių tvarkymas visame pasaulyje

Kitas būdas tvarkyti išimtis WCF yra įdiegti „IErrorHandler“ sąsają savo paslaugų klasėje, kad visos išimtys būtų tvarkomos visame pasaulyje ir pateikiama su SOAP suderinama „FaultException“. Šioje sąsajoje yra du metodai - „HandleError“ ir „ProvideFault“. Nors pirmasis naudojamas tam tikrai veiklai su klaida atlikti, antrasis naudojamas grąžinti klaidos pranešimą. Atminkite, kad „IErrorHandler“ galite sukonfigūruoti (įjungti arba išjungti) savo paslaugos konfigūruojamame faile.