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

У нас есть следующие сервисные контракты WCF:

[ServiceContract(Namespace = "http://example.com", Name = "Service1")]
public interface IService1
{      
  [OperationContract]
  [FaultContract(typeof(Fault1))]
  ValidateUserResult ValidateUser(
                       string username, 
                       string password);
}

[ServiceContract(Namespace = "http://example.com", Name = "Service1")]
public interface IService1Async
{      
    [OperationContract(AsyncPattern = true)]
    [FaultContract(typeof(Fault1))]
    IAsyncResult BeginValidateUser(
                       string username, 
                       string password, 
                       AsyncCallback callback, 
                       object userState);

    ValidateUserResult EndValidateUser(IAsyncResult asyncResult);
}

[DataContract(Namespace = "http://example.com")]
public class Fault1
{
}

Мы вызываем асинхронную версию ValidateUser на стороне клиента и выбрасываем FaultException<Fault1> на сервер, но все, что получает клиент, — это базовый FaultException.

Что может быть причиной того, что указанная в договоре неисправность не получена?


person Román    schedule 09.04.2010    source источник


Ответы (2)


Теперь мы нашли почему. Мы генерируем ошибку из поведения службы, используя метод ProvideFault. Там мы используем код, аналогичный примеру в IErrorHandler. .ProvideFault в msdn

Единственная разница заключалась в том, что мы не передавали правильное действие при перегрузке Message.CreateMessage. Мы скопировали именно то, что сгенерируется в случае, если мы вручную сгенерируем ошибку, и вуаля.

Мои извинения за то, что я не дал этой последней детали :-)

person Román    schedule 09.04.2010

Можете ли вы показать нам операторы catch для вашего звонка? Контракт и все выглядит хорошо для меня...

В каком порядке вы проверяете ошибки?? Вам нужно будет проверить FaultException<Fault1> перед проверкой FaultException или CommunicationException - есть ли шанс, что вы каким-то образом перепутали этот порядок?

Это работает, когда вы вызываете версию синхронизации метода?

person marc_s    schedule 09.04.2010