Ошибки и исключения WCF
-
01-07-2019 - |
Вопрос
Я впервые пишу службу WCF.Сервис и все его клиенты (по крайней мере, на данный момент) написаны на C #.Службе приходится выполнять большую проверку входных данных, которые она передает, поэтому мне нужно иметь какой-то способ возвращать клиенту неверные данные.Я много читал об ошибках и исключениях, оборачивании исключений в ошибки и множестве противоречивых статей, которые только еще больше сбивают меня с толку.Как правильно поступить с этим делом?
Должен ли я вообще избегать исключений и упаковывать сообщение о возврате результатов?Должен ли я создать специальную ошибку или специальное исключение, или просто выбросить 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))].Итак, это "правильный" способ подойти к этому?
Решение
Если вы выполняете проверку на клиенте и должны иметь допустимые значения после их передачи в метод (вызов веб-службы), то я бы выдал исключение.Это может быть исключение, указывающее на недопустимость указания параметра с именем параметра.(см .:Исключение ArgumentException)
Но вы можете не захотеть полагаться на то, что клиент должным образом проверит данные, и это оставляет вас с предположением, что данные, поступающие в веб-службу, могут быть недействительными.В таком случае это на самом деле не исключительный случай и не должно быть исключением.В этом случае вы могли бы вернуть перечисление или Результирующий объект, для свойства Status которого задано значение enum (OK, Недопустимый, Неполный) и свойства Message, заданного со спецификациями, такими как имя параметра.
Я бы позаботился о том, чтобы такого рода ошибки были обнаружены и исправлены в процессе разработки.Ваш процесс контроля качества должен тщательно проверять допустимое и недопустимое использование клиента, и вы не хотите передавать эти технические сообщения обратно клиенту.Вместо этого вы хотите обновить свою систему проверки, чтобы предотвратить попадание неверных данных в вызов службы.
Мое предположение для любой службы WCF заключается в том, что будет более одного пользовательского интерфейса.Сейчас это может быть веб-интерфейс, но позже я могу добавить другой, используя WinForms, WinCE или даже собственное мобильное приложение для iPhone / Android, которое не соответствует тому, что вы ожидаете от.СЕТЕВЫЕ клиенты.
Другие советы
Выдача исключения бесполезна из службы WCF, Почему бы и нет?Потому что это возвращается как голая ошибка, и вам нужно
a) Установите неисправность так, чтобы она включала исключения
б) Проанализируйте ошибку, чтобы получить текст исключения и посмотреть, что произошло.
Так что да, вам нужна ошибка, а не исключение.В вашем случае я бы создал пользовательский fault, который содержит список полей, которые не прошли проверку, как часть контракта на отказ.
Обратите внимание, что WCF делает забавные вещи со словарями, которые не являются ISerializable;он имеет специальную обработку, поэтому убедитесь, что возвращаемое сообщение хорошо выглядит по проводам;если нет, то вам придется вернуться к массивам.
возможно, вам захочется ознакомиться с блоком проверки корпоративной библиотеки MS Patterns and Practices в сочетании с блоком внедрения политики текст ссылки это позволяет вам украсить члены вашего контракта с данными атрибутами проверки, а также украсить реализацию сервиса, это вместе с его интеграцией с WCF означает, что сбои при проверке автоматически возвращаются как ошибки ArgumentValidationException, каждая из которых содержит объект ValidationDetail для каждого сбоя проверки.
Используя entlib с WCf, вы можете получить много проверок и отчетов об ошибках без необходимости писать много кода