Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемwww.acs-it.ru
1 Модуль 5: Cбои и исключения.
2 Содержание Отображение.NET Framework исключений на сервисные сбои (Service-level Faults) Использование сбоев на стороне сервиса Обработка сбоев и исключений на стороне клиента
3 Урок 1:Отображение.NET исключений на сервисные сбои Отображение исключений на сервисные сбои Преобразование исключений к сбоям Структура SOAP сбоя Сбои в метаданных
4 Отображение исключений на сервисные сбои Предоставляют стек вызова Локальная информация Специфичная информация Закрывают хост Исключения – общий метод диагностики ошибок Не очень хорошие характеристики сервиса
5 Преобразование исключений в сбои Service Contract Domain errors Technical errors Contract errors Design Time Run Time SOAP Fault Domain errors Technical errors Service exception handling SOAP message
6 Структура SOAP-Fault urn:uuid:dd129ffe-a8ff-4a70-ad6f-ad48085e94e8... s:Sender ERROR INFO APPLICATION-SPECIFIC INFORMATION
7 Сбои и метаданные [OperationContract] [FaultContract(typeof(BankService.NoFunds))] void Withdraw(string account, decimal amount); [OperationContract] [FaultContract(typeof(BankService.NoFunds))] void Withdraw(string account, decimal amount); метаданные
8 Урок 2: Использование сбоев на стороне сервиса Разработка сервисов с поддержкой сбоев Какая информация должна быть включена в сбои Типизированные и нетипизированные сбои Использование типизированных сбоев (Typed Fault) Аспекты поведения и исключения Диагностика неожиданных исключений Демонстрация: генерация и обработка исключений в WCF службе
9 Разработка сервисов с поддержкой обработки исключений Domain errors Technical errors Always expected ExpectedUnexpected Inform caller Handle
10 Какую информация включать в сбой Различная степень детализации сбоя для разных участников Конечный пользователь Поддержка на стороне клиента Поддержка на стороне сервиса
11 Типизированные и нетипизированные сбои [DataContract(Namespace=" public class AccountOverdrawnFault { private string accountNo; [DataMember] public string AccountNo { get { return accountNo; } set { accountNo = value; } }... } [DataContract(Namespace=" public class AccountOverdrawnFault { private string accountNo; [DataMember] public string AccountNo { get { return accountNo; } set { accountNo = value; } }... } WCF предоставляет программный интерфейс для создания SOAP сбоев Нетипизированный сбой FaultException Типизированный сбой FaultException DataContract используютс я для Typed Fault
12 Использование типизированных сбоев void Withdraw(string account, decimal amount) { try { bankBusinessObject.Withdraw(account, amount);... } catch (AccountOverdrawnException ex); { AccountOverdrawnFault fault = new AccountOverdrawnFault(ex.accountNo, ex.balanceBefore, ex.amount); throw new FaultException (fault)); } void Withdraw(string account, decimal amount) { try { bankBusinessObject.Withdraw(account, amount);... } catch (AccountOverdrawnException ex); { AccountOverdrawnFault fault = new AccountOverdrawnFault(ex.accountNo, ex.balanceBefore, ex.amount); throw new FaultException (fault)); }
13 No action Аспекты поведения службы и сбои Untyped fault Unhandled exception Domain error Expected technical error Unexpected technical error Typed fault Ongoing communication Ongoing communication Faulted channel
14 Способы обработки исключений Способ 1 – использовать try-catch блоки Try/catch блоки в каждой операции сервиса Преобразование исключений в сбои на основе политик Способ 2 – использовать специализированные обработчики ошибок (error handlers) Создать собственный error handler с специализированным кодом Реализовать метод IErrorHandler.HandleError Добавить обработчик в коллекцию ChannelDispatchers Удалить дублирующийся функционал из прикладного кода службы
15 Диагностика непредвиденных исключений По умолчанию детальная информация не передается клиенту Обеспечение требований по безопасности Проблема для диагностики исключений Устанавливаем includeExceptionDetailInFaults свойство serviceDebug Отключаем в Environment среде......
16 Отладка сбоев [DataContract] public class ExceptionDetail { public ExceptionDetail(Exception exception); [DataMember] public string HelpLink{get; private set;} [DataMember] public ExceptionDetail InnerException{get; private set;} [DataMember] public string Message {get; private set;} [DataMember] public StackTrace {get; private set;} [DataMember] public string Type {get; private set;} } [DataContract] public class ExceptionDetail { public ExceptionDetail(Exception exception); [DataMember] public string HelpLink{get; private set;} [DataMember] public ExceptionDetail InnerException{get; private set;} [DataMember] public string Message {get; private set;} [DataMember] public StackTrace {get; private set;} [DataMember] public string Type {get; private set;} }
17 Использование ExceptionDetail Создать экземпляр ExceptionDetail Инициализировать его исключением, которое должно быть доставлено клиенту Инициализируется объект FaultException Клиент перехватывает FaultException
18 Декларативная передача исключений [AttributeUsage(AttributeTargets.Class)] public sealed class ServiceBehaviorAttribute: Attribute, … { public bool IncludeExceptionDetailInFaults {get; set;} } [ServiceBehavior(IncludeExceptionDetailInFaults = false)] class MyService:IMyServiceContract { } [AttributeUsage(AttributeTargets.Class)] public sealed class ServiceBehaviorAttribute: Attribute, … { public bool IncludeExceptionDetailInFaults {get; set;} } [ServiceBehavior(IncludeExceptionDetailInFaults = false)] class MyService:IMyServiceContract { }
19 Хост и диагностика исключений ServiceHost host = new ServiceHost(typeof(MyService)); ServiceBehaviorAttribute debuggingBehavior = host.Description.Behaviors.Find (); debuggingBehavior.IncludeExceptionDetailInFaults = true; host.Open(); ServiceHost host = new ServiceHost(typeof(MyService)); ServiceBehaviorAttribute debuggingBehavior = host.Description.Behaviors.Find (); debuggingBehavior.IncludeExceptionDetailInFaults = true; host.Open();
20 Демонстрация Создание типизированных исключений и их использование в контрактах данных Обработка исключений на стороне сервиса
21 Урок 3: Обработка сбоев и исключений на стороне клиента Обработка сервисных исключений Communication Exceptions Обработка Typed Faults Обработка Untyped Faults Сбои и коммуникационные паттерны Демонстрация: обработка исключений на стороне клиента
22 Обработка сервисных исключений Весь remote код должен быть помещен в try/catch блок Необходимо пересоздать proxy при отказе канала Клиент должен обрабатывать: Ожидаемые исключения предметной области и технические сбои Непредвиденные технические сбои могут повредить канал Коммуникационные ошибки (приводят к отказу канала)
23 Коммуникационные исключения CommunicationException CommunicationObjectFaultedException TimeoutExceptionEndpointNotFound ProtocolException
24 Обработка типизированных сбоев try { bankServiceProxy.Withdraw("ABC123", );... } catch (FaultException ex); { AccountOverdrawnFault fault = ex.Detail; Console.WriteLine("{0}. Account {1}, balance before {2}", fault.Message, fault.Account, fault.Balance); } try { bankServiceProxy.Withdraw("ABC123", );... } catch (FaultException ex); { AccountOverdrawnFault fault = ex.Detail; Console.WriteLine("{0}. Account {1}, balance before {2}", fault.Message, fault.Account, fault.Balance); }
25 Обработка нетипизированных сбоев try { bankServiceProxy.Withdraw("ABC123", );... } catch (FaultException ex); { Console.WriteLine("Service fault: {0}.", ex.Reason); } try { bankServiceProxy.Withdraw("ABC123", );... } catch (FaultException ex); { Console.WriteLine("Service fault: {0}.", ex.Reason); } Включите includeExceptionDetailInFaults для более детальной информации
26 Сбои и коммуникационные паттерны Duplex Сбои определяются в контрактах обратного вызова Большинство ошибок сосредоточены в request/response One-way operations Сбой не происходит при отправке сообщения Следующий вызов вызывает сбой
27 Сбои и обратный вызов interface IMyContractCallback { [OperationContract] void OnCallback(); } [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))] interface IMyContract { [OperationContract] [FaultContract(typeof(InvalidOperationException))] void MyMethod(); } interface IMyContractCallback { [OperationContract] void OnCallback(); } [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))] interface IMyContract { [OperationContract] [FaultContract(typeof(InvalidOperationException))] void MyMethod(); }
28 Отладка обратного вызова [ClientBehavior(IncludeExceptionDetailInFaults = false)] class MyClient:IMyContractCallback { ….. }
29 Упражнения Создать сервис который генерирует типизированный сбой Создать клиент, который обрабатывает сбой службы
30 Расширенная обработка ошибок Способ 1 – использовать try-catch блоки Try/catch блоки в каждой операции сервиса Преобразование исключений в сбои на основе политик Способ 2 – использовать специализированные обработчики ошибок (error handlers) Создать собственный error handler с специализированным кодом Реализовать метод IErrorHandler.HandleError Добавить обработчик в коллекцию ChannelDispatchers Удалить дублирующийся функционал из прикладного кода службы
31 Расширенная обработка ошибок public interface IErrorHandler { bool HandlerError(Exception error); void ProvideFault(Exception error, MessageVersion version, ref Message fault); } public interface IErrorHandler { bool HandlerError(Exception error); void ProvideFault(Exception error, MessageVersion version, ref Message fault); } Метод ProvideFault объекта расширения вызывается немедленно если в службе произошло исключение. WCF вызывает ProvideFault перед возвращением управления клиенту Метод вызывается во входном потоке
32 Использование ProvideFault public class MyErrorHandler: IErrorHandler { bool HandlerError(Exception error){….} void ProvideFault(Exception error, MessageVersion version, ref Message fault) { FaultException faultException = new FaultException (3); MessageFault messageFault = faultException.CreateMessageFault(); fault = Message.CreateMessage(version, messageFault, faultException.Action); } public class MyErrorHandler: IErrorHandler { bool HandlerError(Exception error){….} void ProvideFault(Exception error, MessageVersion version, ref Message fault) { FaultException faultException = new FaultException (3); MessageFault messageFault = faultException.CreateMessageFault(); fault = Message.CreateMessage(version, messageFault, faultException.Action); }
33 Обработка сбоев bool HandlerError(Exception error); Вызывается после возврата управления клиенту Предназначен для использования на стороне сервиса Вызывается в отдельном потоке Никак не влияет на клиента Если возвращает false вызывается метод других установленных расширений.
34 Пример использования public class MyErrorHandler: IErrorHandler { bool HandlerError(Exception error) { try { LogServiceClient proxy = new LogServiceClient; proxy.Log(…); proxy.Close(); } catch{} finally{ return false;} } void ProvideFault(Exception error, MessageVersion version, ref Message fault) { ….. } public class MyErrorHandler: IErrorHandler { bool HandlerError(Exception error) { try { LogServiceClient proxy = new LogServiceClient; proxy.Log(…); proxy.Close(); } catch{} finally{ return false;} } void ProvideFault(Exception error, MessageVersion version, ref Message fault) { ….. }
35 Установка расширений обработки ошибок public class ChannelDispatcher: ChannelDispatcherBase { public Collection ErrorHandlers{get;} } public class ChannelDispatcher: ChannelDispatcherBase { public Collection ErrorHandlers{get;} } Необходимо включить собственный обработчик в коллекцию нужного диспетчера(либо всех) службы Расширения должны добавляться до получения службой первых вызовов, но после инициализации диспетчеров. Хост уже инициализирован, но не открыт. Лучше рассматривать расширения как пользовательские аспекты поведения.
36 Пример установки расширений class MyErrorHandler:IErrorHandler {…} class MyService:IMyContract, IServiceBehavior { public void ApplyDispatchBehavior(ServiceDescription description, ServiceHost host) { IErrorHandler handler = new MyErrorHandler(); foreach(ChannelDispatcher dispatcher in host.ChannelDispatchers) { dispatcher.ErrorHandlers.Add(handler); } public void Validate(…){} public void AddBindingParameters(…){} } class MyErrorHandler:IErrorHandler {…} class MyService:IMyContract, IServiceBehavior { public void ApplyDispatchBehavior(ServiceDescription description, ServiceHost host) { IErrorHandler handler = new MyErrorHandler(); foreach(ChannelDispatcher dispatcher in host.ChannelDispatchers) { dispatcher.ErrorHandlers.Add(handler); } public void Validate(…){} public void AddBindingParameters(…){} }
37 Обсуждение вопросов 2 2 Подведение итогов урока 1 1 Подведение итогов
38 Лабораторная работа: Работа с интерфейсами и системными типами. Создать сервис, где обработка сбоев осуществляется с помощью IErrorHandler.HandleError Отправить решение на почту:
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.