Пользовательская ошибка WCF не правильно отловлена ​​в клиенте - PullRequest
5 голосов
/ 27 февраля 2012

Я пытаюсь создать несколько пользовательских FaultException. Я создал класс DataContract с именем CreateFault.

[DataContract]
public class CreateFault
{
    private string report;

    public CreateFault(string message)
    {
        this.report = message;
    }

    [DataMember]
    public string Message
    {
        get { return this.report; }
        set { this.report = value; }
    }
}

Затем я добавляю ошибку в сервисный метод.

В IService1.cs

[OperationContract]
[FaultContract(typeof(CreateFault))]
void TestFaultException();

и Service1.cs

public void TestFaultException()
{
    throw new FaultException<CreateFault>(new CreateFault("CreateFault message"), "Message abt exception");
}

Я ловлю FaultException в моем клиенте.

private void btnTest_Click(object sender, RoutedEventArgs e)
{
    try
    {
        ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
        client.TestFaultException();
    }
    catch (FaultException<CreateFault> ex)
    {
        MessageBox.Show(ex.Detail.Message, "Success", MessageBoxButton.OK, MessageBoxImage.Error);
    }
    catch (FaultException ex)
    {
        MessageBox.Show(ex.Message, "Failure", MessageBoxButton.OK, MessageBoxImage.Error);
    }
    catch (Exception ex)
    {
    }
}

Теперь возникает проблема. Когда я создаю проект приложения-службы WCF в Visual Studio 2010, он работает как ожидалось. Ошибка поймана в:

catch (FaultException<CreateFault> ex)

Но когда я создаю проект библиотеки служб WCF с моим пользовательским FaultExceptions, клиент не распознает мое пользовательское исключение. Вместо этого он ловит ошибку в:

catch (FaultException ex)

Почему он не работает с проектом приложения-службы WCF?

Edit: Это то, что я получаю во время отладки, когда ловит исключение в

catch (FaultException ex)

(набрал? Ex в Immediate window)

{"Сообщение об исключении"}

[System.ServiceModel.FaultException<WpfApplication1.ServiceReference2.CreateFault>]: {"Message abt exception"}
base {System.ServiceModel.CommunicationException}: {"Message abt exception"}
Action: "http://tempuri.org/IService1/TestFaultExceptionCreateFaultFault"
Code: {System.ServiceModel.FaultCode}
Message: "Message abt exception"
Reason: {Message abt exception}

Edit2:

Нашел проблему. У меня было две ссылки на сервисы, которые оба имели CreateFault DataContract. И он использовал не тот, когда я запустил программу.

Когда я изменился на

catch (FaultException<ServiceReference2.CreateFault> ex) 

сработало

1 Ответ

4 голосов
/ 28 февраля 2012

Нашел проблему. У меня было две ссылки на сервисы, которые оба имели CreateFault DataContract. И он использовал не тот, когда я запускал программу.

Когда я изменился на

catch (FaultException<ServiceReference2.CreateFault> ex) 

это сработало

...