Подход к передаче результата проверки в случае сбоя из службы WCF (с обработкой данных EF4) клиенту MVC3

Я реализую приложение ASP.NET MVC3, в котором доступ к данным осуществляется через службы WCF. Служба WCF использует EF4.1 для доступа к данным с классами DBContext и POCO для сущностей. Я могу аннотировать свойства с помощью атрибутов проверки данных на стороне сервера, а также могу реализовать настраиваемую проверку, определив либо настраиваемые атрибуты проверки (производные от ValidationAttribute) или путем реализации IValidatableObject).

Но у меня проблема: если проверка не удалась, как лучше всего передать информацию об ошибке проверки из WCF клиенту, а затем использовать ее в клиенте MCV3?

Насколько я понимаю с помощью WCF, все данные, которыми обмениваются клиент и служба WC, должны быть частью контракта данных и не должны использовать исключения как способы передачи значимой информации между сервером и клиентом (например, выброс ValidationException с дополнительными свойствами, установленными для информации об ошибке проверки. ).

Также в WCF, использующем EF, я вызываю dbContext.SaveData (), но если данные недействительны, генерируется исключение, которого я не хочу.

So:

  1. как я могу явно вызвать проверку в EF и убедиться, что либо объект действителен, и я могу вызвать SaveData (), либо объект недействителен, и я могу каким-то образом собрать информацию об ошибке проверки для передачи клиенту.

  2. Как я могу передать эту информацию об ошибке проверки обратно клиенту как часть контракта данных, а не в качестве исключения.

Спасибо


person bzamfir    schedule 26.10.2011    source источник


Ответы (1)


Вы можете использовать два подхода:

  • Используйте стандартный контракт данных ответа для успеха и контракт сбоя с FaultException<YourFaultContract> для сбоя проверки . Типизированные исключения ошибок - это способ определения «ожидаемых» исключений - это просто еще один контракт данных, переданный в SOAP Fault, описывающий некоторый сбой.
  • Создайте контракт данных ответа, который содержит что-то вроде кода результата, данных ответа, сообщения об ошибке и т. Д., И используйте этот контракт данных как для успеха, так и для отказа. Мне такой подход не нравится, но его проще использовать в некоторых ESB, где сбои обрабатываются особым образом.
person Ladislav Mrnka    schedule 26.10.2011
comment
Спасибо. Но как я могу проверить объект в WCF / EF без вызова SaveData () или как заполнить MyFaultContract информацией об ошибке проверки, когда EF dataContext.SaveData () выдает исключение? Мне может помочь любой фрагмент кода или ссылка на соответствующую статью :) - person bzamfir; 26.10.2011
comment
Указанная статья из MSDN содержит фрагмент кода - вы поймаете исключение проверки при вызове данных сохранения, подготовите контракт об ошибке и создадите новый FaultException. - person Ladislav Mrnka; 26.10.2011