Исключения в веб-сервисах
-
09-06-2019 - |
Вопрос
Моя группа разрабатывает приложение на основе служб (.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 а> р>