Вопрос

Я впервые пишу службу 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, вы можете получить много проверок и отчетов об ошибках без необходимости писать много кода

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top