Вы можете перехватить исключительную ситуацию на стороне клиента следующим образом:
try {
MyClient.MyCall();
}
catch (FaultException<IOException> exc) {
// Log and handle exception
}
Там, где реальное исключение было, в данном примере, IOException
.
Вам также понадобится FaultContract
, как вы указали, в интерфейсе сервиса, как таковой:
[ServiceContract]
public interface IMyService {
[OperationContract]
[FaultContract(typeof(IOException))]
void MyCall();
}
**** РЕДАКТИРОВАТЬ ****
Я немного запутался в том, что вы написали:
[FaultContract (typeof (InforError))]] где "InfoError" - это моеcustum DataMember
Что вы подразумеваете под «DataMember»?Какое определение для InfoError
?
[FaultContract]
должно быть определено в методе интерфейса службы ... в вашем посте вы звучите так, будто пытаетесь добавить его на стороне клиента;это не правильно.Если я изменю ваш пример кода, он будет выглядеть следующим образом:
[ServiceContract]
public interface IMyService {
[OperationContract(AsyncPattern = true)]
[FaultContract(typeof(InfoErrorException))]
IAsyncResult BeginLoadDocument(Byte[] value, AsyncCallback callback, object state);
string EndLoadDocument(IAsyncResult asyncResult);
Если ваш интерфейс службы оформлен таким образом, клиент должен иметь возможность получать FaultException
s при вызове EndLoadDocument
(при условиибыло сгенерировано исключение InfoErrorException
).
На стороне сервера необходимо перехватывать исключения, а затем заключать их в FaultException
, например:
catch (IOException exp) {
InfoErrorException myException = new InfoErrorException();
myException.Reason = "I failed: " + exp.Message;
throw new FaultException<InfoErrorException>(myException);
}
Я считаю (но должен был бы перепроверить), что вы также можете поймать FaultException
на стороне клиента без указания типа ... похоже на перехват универсального System.Exception
.
Ваш try...catch
для FaultException
должен быть в вашем обратном вызове вокруг оператора для вызова EndLoadDocument()
.