Правильный отлов определенных исключений через веб-сервис - PullRequest
1 голос
/ 13 мая 2009

В настоящее время я использую службу C # .NET в нашей клиентской программе. В рамках разработки сервера выдается несколько пользовательских исключений, указывающих на конкретные ошибки (как в любой обычной настольной программе).

Проблема заключается в том, что веб-служба отлавливает эти ошибки и сериализует их в FaultException, с фактическим исключением (например, NoRoomsAvailableException), записанным в поле Message.

Мой вопрос: есть ли лучшая практика для обработки этих ошибок? Мы только начали работать над этим, и мы, вероятно, выполнили бы какое-то сопоставление с текстовым шаблоном, чтобы извлечь тип исключения и сообщение об ошибке, но это выглядит как хакерский способ сделать это, поэтому любой «чистый» способ сделать это будет намного оценили.

Ответы [ 2 ]

2 голосов
/ 13 мая 2009

Правильным способом было бы определить договоры о неисправностях. Например, в вашем веб-сервисе вы можете сделать следующее:

[DataContract]
public class NoRoomsAvailableFaultContract
{
    [DataMember]
    public string Message { get; set; }
}

Далее вы объявляете этот контракт для данной сервисной операции

[ServiceContract]
public interface IMyServiceContract
{
    [OperationContract]
    [FaultContract(typeof(NoRoomsAvailableFaultContract))]
    void MyOperation();
}

И вы реализуете это так:

public class MyService : IMyServiceContract 
{
    public void MyOperation()
    {
        if (somethingWentWrong)
        {
            var faultContract = new NoRoomsAvailableFaultContract()
            {
                Message = "ERROR MESSAGE"
            };
            throw new FaultException<NoRoomsAvailableFaultContract>(faultContract);
        }
    }
}

В этом случае NoRoomsAvailableFaultContract будет представлен в WSDL, а svcutil.exe может создать прокси-класс. Тогда вы можете поймать это исключение:

try
{
    myServiceProxy.MyOperation();
}
catch (FaultException<NoRoomsAvailableFaultContract> ex)
{
    Console.WriteLine(ex.Message);
}
0 голосов
/ 13 мая 2009

Дарин имеет правильный ответ. Я только скажу прямо, что он подразумевает: веб-сервисы не пропускают исключения. Они возвращают ошибки SOAP. Если вы правильно определите свои ошибки, как он, то вы получите FaultException <<em> fault >. Это станет SOAP Fault с fault в элементе detail. В случае клиента .NET это будет преобразовано в FaultException <<em> fault >, который вы можете перехватить.

Другие платформы могут справиться с этим несколько иначе. Я видел, как IBM Rational Web Developer генерирует прокси-код Java, который создает отдельное исключение для каждой объявленной ошибки. Это была версия до Java-дженериков, поэтому, возможно, сейчас она делает то же самое, что и .NET.

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