Обработка исключений Wcf выдает ошибку - PullRequest
2 голосов
/ 02 сентября 2010

Привет, у меня проблема с обработкой исключений в 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'"));
    }
}

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

Не удалось вызвать службу.Возможные причины: служба недоступна или недоступна;конфигурация на стороне клиента не соответствует прокси;существующий прокси-сервер недействителен.Обратитесь к трассировке стека для более подробной информации.Вы можете попытаться восстановить, запустив новый прокси-сервер, восстановив конфигурацию по умолчанию или обновив службу.

, если я изменю метод SavePerson и вместо:

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

Ido

catch(Exception)
{
    throw;
}

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

1 Ответ

3 голосов
/ 02 сентября 2010

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

[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'")); 
}
...