Вопрос

Моя группа разрабатывает приложение на основе служб (.NET WCF), и мы пытаемся решить, как обрабатывать исключения в наших внутренних службах. Должны ли мы бросать исключения? Возвращать исключения, сериализованные как XML? Просто вернуть код ошибки?

Имейте в виду, что пользователь никогда не увидит эти исключения, это только для других частей приложения.

Это было полезно?

Решение

WCF использует SoapFaults в качестве родного способа передачи исключений либо из службы клиенту, либо из клиента в службу.

Вы можете объявить пользовательскую ошибку SOAP, используя атрибут FaultContract в интерфейсе контракта:

Например:

[ServiceContract(Namespace="foobar")]
interface IContract
{
    [OperationContract]
    [FaultContract(typeof(CustomFault))]
    void DoSomething();
}


[DataContract(Namespace="Foobar")]
class CustomFault
{
    [DataMember]
    public string error;

    public CustomFault(string err)
    {
        error = err;
    }
}

class myService : IContract
{
    public void DoSomething()
    {
        throw new FaultException<CustomFault>( new CustomFault("Custom Exception!"));
    }
}

Другие советы

Ну, а почему бы просто не выбросить стандартные исключения SOAP? Проблема с кодами ошибок и сериализованным XML заключается в том, что им обоим требуется дополнительная логика, чтобы распознать, что ошибка действительно произошла. Такой подход полезен только в том случае, если у вас есть специализированная регистрация или логика, которая должна происходить на другой стороне веб-службы. Такой пример будет возвращать флаг, который говорит, что "можно продолжать" с сообщением об ошибке исключения.

Независимо от того, как вы его бросите, это не облегчит работу, поскольку вызывающая сторона все еще должна признать, что возникло исключение, и справиться с ним.

Я немного сбит с толку, я не обманываю - вы говорите, что хотите вернуть исключения, сериализованные как XML, с одной стороны, и что пользователь никогда не увидит исключения, с другой стороны. Кто будет видеть эти исключения?

Обычно я бы сказал использовать контракты ошибок WCF.

Фил, разные части приложения вызывают друг друга с помощью WCF. & Quot; возвратить исключения, сериализованные как XML, " Я имел в виду, что возвращаемое значение функции будет объектом исключения. Успех будет обозначен нулем.

Я не думаю, что это правильный вариант.

Контракты на ошибки WCF звучат хорошо, но я ничего о них не знаю. Проверка Google прямо сейчас.

Я бы не стал отправлять исключения напрямую клиенту, если вы не согласны с отправкой этих подробностей.

Я бы порекомендовал использовать ошибки WCF для передачи вашего сообщения об ошибке и кода (что может быть использовано для принятия решения о том, что получатель должен повторить попытку, произошла ошибка и т. д.), в зависимости от того, является ли отправитель или получатель ошибочным.

Это можно сделать с помощью FaultCode.CreateReceiverFaultCode и FaultCode.CreateSenderFaultCode.

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

Ошибки .NET WCF, генерирующие неправильные значения кода ошибки SOAP 1.1

scroll top