WCF ошибки и исключения - PullRequest
       17

WCF ошибки и исключения

6 голосов
/ 19 сентября 2008

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

Должен ли я вообще избегать исключений и упаковывать сообщение о возвращении результатов? Должен ли я создать специальный Fault, или особое Exception, или просто выбросить 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 ]

4 голосов
/ 22 сентября 2008

Создание исключения бесполезно из службы WCF. Почему бы и нет? Потому что это возвращается как чистая ошибка, и вам нужно

a) Установите ошибку, чтобы включить исключения

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

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

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

3 голосов
/ 19 сентября 2008

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

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

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

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

2 голосов
/ 22 сентября 2008

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

Используя entlib с WCf, вы можете получить много проверок и отчетов об ошибках без необходимости писать много кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...