Обработка на изключения в WCF

Изключения са грешки, които възникват по време на изпълнение; обработка на изключения е техниката за обработка на тези грешки по време на изпълнение. Обикновено бихте използвали блокове за опит, улавяне и накрая (известни също като блокове за изключения) в кода на вашето приложение за обработка на изключения. Ако изключенията не се обработват правилно в кода на приложението и възникне изключение по време на изпълнение, изпълнението на приложението ще прекрати.

Обработката на изключения в WCF не е толкова пряка - вие сте ограничени да изпращате .Net обекти по проводника и вашата WCF услуга може да изпраща само сериализирани данни, т.е. SOAP съобщения до клиента. Можете да обработвате изключения в WCF по един от следните три начина:

  1. Използване на FaultException
  2. Използване на IErrorHandler
  3. Използване на returnUnknownExceptionsAsFaults

В тази публикация ще представя дискусия за различните начини, по които съобщенията за изключения могат да се предават от услугата WCF до потребителите на услугата.

Помислете за тази проста WCF услуга.

[Договор за услуги]

публичен интерфейс IDBManagerService

    {

        [OperationContract]

        void Save (Служител е изпратен);

    }

Договорът за услуга IDBManagerService съдържа един договор за операция за запазване на обект на служител в базата данни.

публичен клас DBManagerService: IDBManagerService

    {

        void Запазване (Служител emp)

        {

         опитвам

           {

            // Код за съхраняване на обект на служител в базата данни

           }

           catch (Изключение ex)

           {

               хвърли ново изключение („Възникна грешка при запазване на данни ...“);

           }

        }

    }

Сега да предположим, че има грешка при свързване с базата данни или съхраняване на обект на служител в базата данни по времето, когато се опитвате да консумирате услугата. След това бихте получили изключение с това съобщение: "System.ServiceModel.FaultException: Сървърът не можа да обработи заявката поради вътрешна грешка. За повече информация относно грешката или включете IncludeExceptionDetailInFaults (или от ServiceBehaviorAttribute, или от конфигурацията поведение) на сървъра, за да изпрати обратно информацията за изключение обратно на клиента или да включи проследяване съгласно документацията на SDK на Microsoft .Net Framework 3.0 и да провери регистрационните файлове за проследяване на сървъра. "

Можете да използвате задайте елемента includeExceptionDetailInFaults на true във файла web.config, така че допълнителните подробности за изключението да са включени в грешката, за да ви е по-удобно да проверите какво всъщност се е объркало.

Можете също да постигнете това, като напишете код. Ето кодов фрагмент, който илюстрира как можете да зададете това свойство на true.

    typeof (ServiceDebugBehavior));

    нов ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Можете също да зададете това на true, като използвате маркера ServiceBehavior, както е показано по-долу.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

публичен клас DBManagerService: IDBManagerService

{

}

Когато се опитате да използвате услугата отново, ще видите по-точно съобщение за изключение.

Използване на FaultException

Ако обаче трябва да предавате удобни за потребителя съобщения за изключения от услугата, трябва да хвърлите изключения за грешки. Изключенията за неизправности са изключения, които се генерират от услуга на WCF, когато възникне изключение по време на изпълнение - такива изключения обикновено се използват за предаване на нетипизирани данни за неизправности на потребителите на услугата. Можете да обработвате изключения в методите си за обслужване по същия начин, по който го правите с други методи и след това да ги превръщате в изключения за грешки.

Кодовият фрагмент по-долу показва актуализирания метод на услугата - методът на услугата сега извежда изключение за грешка.

публичен клас DBManagerService: IDBManagerService

    {

        void Запазване (Служител emp)

        {

            опитвам

            {

               // Код за съхраняване на обект на служител в базата данни

            }

            catch (Изключение ex)

            {

               хвърли нов FaultException („Възникна грешка при запазване на данни ...“);

            }

        }

    }

Сега ще трябва да се справите с изключение на грешки във вашия код, когато консумирате тази услуга. Можете да научите повече за изключенията за грешки в WCF от тази статия за MSDN.

Можете също така да създадете потребителски клас грешка, който е маркиран с атрибута DataContract.

[DataContract]

публичен клас CustomFault

{

[DataMember]

публичен низ Източник;

[DataMember]

публичен низ ExceptionMessage;

[DataMember]

публичен низ InnerException;

[DataMember]

публичен низ StackTrace;

}

Следният кодов фрагмент илюстрира как можете да използвате класа CustomFault, за да хвърлите силно въведен FaultException.

void Запазване (Служител emp)

{

опитвам

{

  // Код за запазване на обекта на служител в базата данни

}

catch (Изключение ex)

{

CustomFault cx = нов CustomFault ();

хвърли нов FaultException (напр., нов FaultReason ("Това е силно въведено неизправно изключение"));

}

}

Също така ще трябва да посочите атрибута FaultContract във вашия метод на услуга, който би повдигнал FaultException. Модифицираният метод Save ще изглежда така.

[Договор за услуги]

публичен интерфейс IDBManagerService

    {

        [OperationContract]

        [FaultContract]

        void Save (Служител е изпратен);

    }

Използване на returnUnknownExceptionsAsFaults

Можете да използвате атрибута returnUnknownExceptionsAsFaults в конфигурацията на поведението на услугата, за да повдигнете автоматично изключение като SOAP грешка. Следният кодов фрагмент илюстрира как можете да постигнете това.

                 returnUnknownExceptionsAsFaults = "True">

Обработка на изключенията в световен мащаб

Друг начин за справяне с изключенията в WCF е чрез внедряване на интерфейса IErrorHandler във вашия сервизен клас, за да се справят с всички изключения в световен мащаб и да предоставят съвместим със SOAP FaultException. Този интерфейс съдържа два метода - HandleError и ProvideFault. Докато първият се използва за извършване на някаква дейност с грешката, вторият се използва за връщане на съобщение за грешка. Имайте предвид, че можете също да конфигурирате IErrorHandler (да го включите или изключите) във вашия конфигурируем файл на услугата.