Elem e = enumerable.FirstOrDefault();
//do something with e
Вы не можете этого сделать:
Веб-службы 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
, например. Когда я'
Если ваша цель - создать исключение, чтобы пользователь мог знать, что что-то пошло не так, возникло какое-то конкретное исключение и обработать его особенным образом, у вас есть возможность. Вам просто нужно полагаться на правильную реализацию клиентского прокси (действительно, один из вариантов - предоставить клиентские прокси самостоятельно).
Здесь есть полезная статья о том, как SoapException
].
По сути, все сводится к кодированию сведений об исключении (например, кода ошибки) в узле сведений SoapException
, а затем его синтаксическому анализу на стороне клиента перед повторным генерированием исключения.
Невозможно воссоздать исключение, как если бы оно было переброшено через границу службы, и там '
В клиентском вызове службы WCF, которая выдает ошибку, вы выполняете
try ..
перехватываете ошибку как FaultException (Of YourService.FooBarFault)
end try
Вы должны объявить FaultContract для метода обслуживания, который может генерировать ошибку, например,
_
<FaultContract(GetType(FooBarFault))> _
Function yourCall