2008-09-18 4 views
6

Я пишу службу WCF в первый раз. Сервис и все его клиенты (по крайней мере пока) написаны на C#. Служба должна выполнить большую проверку ввода данных, переданных ей, поэтому мне нужно каким-то образом указать неверные данные клиенту. Я много читал о ошибках и исключениях, обертывании исключений в ошибках и о многих противоречивых статьях, которые меня просто путают. Каков правильный способ справиться с этим делом?Ошибки WCF и исключения

Должен ли я вообще избегать исключений и упаковывать сообщение результатов? Должен ли я создать специальный Fault или специальное исключение или просто выбросить ArgumentExceptions, как я бы сделал для функции проверки не WCF?

код я прямо сейчас (под влиянием MSDN) является:

[DataContract] 
public class ValidationFault 
{ 
    [DataMember] 
    public Dictionary<string, string> Errors { get; private set; } 

    [DataMember] 
    public bool Fatal { get; private set; } 

    [DataMember] 
    public Guid SeriesIdentifier { get; private set; } 

    public ValidationFault(Guid id, string argument, string error, bool fatal) 
    { 
     SeriesIdentifier = id; 
     Errors = new Dictionary<string, string> {{argument, error}}; 
     Fatal = fatal; 
    } 

    public void AddError(string argument, string error, bool fatal) 
    { 
     Errors.Add(argument, error); 
     Fatal |= fatal; 
    } 
} 

И на методе есть [FaultContract (TypeOf (ValidationFault))]. Так это «правильный» способ приблизиться к этому?

ответ

3

Если вы выполняете проверку на клиенте и должны иметь действительные значения после их передачи в метод (вызов веб-службы), я бы выбрал исключение. Это может быть исключение, указывающее, что параметры недействительны с именем параметра. (см .: ArgumentException)

Но вы можете не захотеть полагаться на клиента для правильной проверки данных, и это оставляет вам предположение, что данные могут быть недействительными в веб-службе. В этом случае это действительно не исключительный случай и не должен быть исключением. В этом случае вы можете вернуть enum или объект Result, у которого свойство Status установлено на enum (OK, Invalid, Incomplete) и свойство Message, заданное с определенными параметрами, например имя параметра.

Я бы удостоверился, что эти ошибки обнаружены и исправлены во время разработки. Процесс QA должен тщательно проверять действительные и недействительные действия клиента, и вы не хотите передавать эти технические сообщения клиенту. Вместо этого вы должны обновить свою систему проверки, чтобы предотвратить получение неверных данных на вызов службы.

Мое предположение для любой службы WCF заключается в том, что будет более одного пользовательского интерфейса. Теперь можно быть веб-интерфейсом, но позже я могу добавить другое, используя WinForms, WinCE или даже родное приложение для iPhone/Android, которое не соответствует ожидаемому от клиентов .NET.

2

Возможно, вы захотите взглянуть на блок валидации корпоративной библиотеки MS Patterns and Practices вместе с блоком впрыска политики link text, который позволяет вам украшать ваши данные участниками договора с атрибутами проверки, а также украшать реализацию сервиса, это вместе с его интеграцией с WCF это означает, что ошибки в проверке возвращаются, поскольку ArgumentValidationException автоматически сбрасывает каждый из них, содержащий объект ValidationDetail для каждого отказа проверки.

Использование EntLib с ФОС вы можете получить много проверки, сообщений об ошибках без необходимости писать много кода

+0

Для всех, кто интересуется, здесь [ссылка] (http://msdn.microsoft.com/en-us/library/ff953182 (v = pandp.50) .aspx) для руководства по началу работы с блоком валидации EntLib , – Crackerjack 2012-03-08 23:28:06

4

Бросив исключение не является полезным из службы WCF Почему нет? Потому что он возвращается в качестве голой вины, и вы должны

а) Установите неисправность включить исключения

б) Разбираем ошибку, чтобы получить текст исключения, и посмотреть, что случилось.

Так что да, вам нужна ошибка, а не исключение.Я бы в вашем случае создал настраиваемую ошибку, которая содержит список полей, которые не прошли проверку, как часть контракта на неисправность.

Обратите внимание, что WCF делает забавные вещи со словарями, которые не являются ISerializable; он имеет специальную обработку, поэтому проверьте, что возвращаемое сообщение выглядит хорошо по проводу; если не вернется к массивам для вас.

Смежные вопросы