Поймайте пользовательское исключение из веб-сервиса ASMX

FirstOrDefault?

Elem e = enumerable.FirstOrDefault();
//do something with e

9
задан John Saunders 18 August 2009 в 21:52
поделиться

3 ответа

Вы не можете этого сделать:

  1. Веб-службы вызывают ошибки SOAP. Исключения зависят от платформы.
  2. Когда исключение не обрабатывается в веб-службе ASMX, .NET преобразует его в ошибку SOAP. Подробности исключения не сериализуются.
  3. В клиенте ASMX ошибка SOAP будет преобразована в SoapException.

Веб-службы ASMX не имеют надлежащей поддержки ошибок SOAP. Невозможно получить какое-либо исключение, кроме SoapException на стороне клиента.

Еще одна причина для обновления до WCF.


В качестве примера того, что вы не можете делать с ASMX, вот как работает WCF. WCF позволяет указать для каждой операции веб-службы, какие ошибки она может возвращать:

[ServiceContract]
public interface IMyServiceContract
{
    [FaultContract(typeof(IntegerZeroFault))]
    [FaultContract(typeof(SomeOtherFault))]
    [OperationContract]
    public string GetSomeString(int someInteger);
}

[DataContract]
public class IntegerZeroFault
{
    [DataMember]
    public string WhichInteger {get;set;}
}

[DataContract]
public class SomeOtherFault
{
    [DataMember]
    public string ErrorMessage {get;set;}
}

public class MyService : IMyServiceContract
{
    public string GetSomeString(int someInteger)
    {
        if (someInteger == 0) 
            throw new FaultException<IntegerZeroFault>(
                new IntegerZeroFault{WhichInteger="someInteger"});
        if (someInteger != 42)
            throw new FaultException<SomeOtherFault>(
                new SomeOtherFault{ErrorMessage ="That's not the anaswer"});
        return "Don't panic";
    }
}

Клиент WCF может затем перехватить FaultException , например. Когда я'

17
ответ дан 4 December 2019 в 09:37
поделиться

Если ваша цель - создать исключение, чтобы пользователь мог знать, что что-то пошло не так, возникло какое-то конкретное исключение и обработать его особенным образом, у вас есть возможность. Вам просто нужно полагаться на правильную реализацию клиентского прокси (действительно, один из вариантов - предоставить клиентские прокси самостоятельно).

Здесь есть полезная статья о том, как SoapException ].

По сути, все сводится к кодированию сведений об исключении (например, кода ошибки) в узле сведений SoapException , а затем его синтаксическому анализу на стороне клиента перед повторным генерированием исключения.

Невозможно воссоздать исключение, как если бы оно было переброшено через границу службы, и там '

5
ответ дан 4 December 2019 в 09:37
поделиться

В клиентском вызове службы WCF, которая выдает ошибку, вы выполняете

try ..

перехватываете ошибку как FaultException (Of YourService.FooBarFault)

end try

Вы должны объявить FaultContract для метода обслуживания, который может генерировать ошибку, например,

_

 <FaultContract(GetType(FooBarFault))> _

 Function yourCall
0
ответ дан 4 December 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: