2010-09-02 7 views
2

Привет У меня проблемы с обработкой исключений в wcf. У меня есть сервис, как этот:Обработка исключений из Wcf выдает ошибку

[ServiceContract] 
public interface IAddressService 
{ 
    [OperationContract] 
    [FaultContract(typeof(ExecuteCommandException))] 
    int SavePerson(string idApp, int idUser, Person person); 
} 

Я звоню SavePerson() на службе в утилите WCFTestClient. SavePerson() реализация:

public int SavePerson(string idApp, int idUser, Person person) 
{ 
    try 
    { 
     this._savePersonCommand.Person = person; 

     this.ExecuteCommand(idUser, idApp, this._savePersonCommand); 

     return this._savePersonCommand.Person.Id; 
    } 
    catch (ExecuteCommandException ex) 
    { 
     throw new FaultException<ExecuteCommandException>(ex, new FaultReason("Error in 'SavePerson'")); 
    } 
} 

Но я получаю эту ошибку:

Failed to invoke the service. Possible causes: The service is offline or inaccessible; the client-side configuration does not match the proxy; the existing proxy is invalid. Refer to the stack trace for more detail. You can try to recover by starting a new proxy, restoring to default configuration, or refreshing the service.

если изменить метод SavePerson и вместо:

catch (ExecuteCommandException ex) 
{ 
    throw new FaultException<ExecuteCommandException>(ex, new FaultReason("Error in 'SavePerson'")); 
} 

Я

catch(Exception) 
{ 
    throw; 
} 

Я не получаю вышеуказанную ошибку, но я получаю сообщение об исключении и внутреннее исключение. Что я делаю неправильно?

+0

ли ExecuteCommandException сериализации? –

+0

ExecuteCommandException наследует от Exception и помечен сериализуемым. Я обнаружил, что если я отправляю исключение, ошибка выше. И обнаружил, что когда исключение выбрасывается со стороны сервера, wcf закрывает канал и отключает клиент. – Luka

ответ

3

При определении договора о неисправности:

[FaultContract(typeof(ExecuteCommandException))] 

вы не должны указывать тип исключения. Вместо этого вы указываете контракт на получение данных по своему выбору для возврата любых значений, которые вы считаете необходимыми.

Например:

[DataContract] 
public class ExecuteCommandInfo { 
    [DataMember] 
    public string Message; 
} 

[ServiceContract] 
public interface IAddressService { 
    [OperationContract] 
    [FaultContract(typeof(ExecuteCommandInfo))] 
    int SavePerson(string idApp, int idUser, Person person); 
} 

catch (ExecuteCommandException ex) { 
    throw new FaultException<ExecuteCommandInfo>(new ExecuteCommandInfo { Message = ex.Message }, new FaultReason("Error in 'SavePerson'")); 
} 
Смежные вопросы