WCF自定义故障异常在客户端未被正确捕获

5

我正在尝试创建一些自定义的 FaultException。我已经制作了一个名为 CreateFaultDataContract 类。

[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)
    {
    }
}

现在问题来了。当我在Visual Studio 2010中创建一个WCF服务应用程序项目时,它按预期工作。错误被捕获在:

catch (FaultException<CreateFault> ex)

当我创建一个带有自定义 FaultExceptions 的 WCF Service Library 项目时,客户端无法识别我的自定义异常。相反地,它会在以下位置捕获错误:

catch (FaultException ex)

为什么它不能与WCF服务应用程序项目一起使用?

编辑: 这是我在调试过程中捕获异常时收到的信息。

catch (FaultException ex)

(在即时窗口中键入?ex)

{"关于异常的信息"}

[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}

编辑2:

找到了问题所在。我有两个服务引用,它们都有CreateFault数据合同。当我运行程序时,它使用了错误的合同。

当我更改为

catch (FaultException<ServiceReference2.CreateFault> ex) 

它起作用了


根据所有的记录,它应该捕获异常。你能检查一下捕获的异常是一个通用的“FaultException<Type>”还是只是“FaultException”吗? - Coder
当我在即时窗口中输入?ex时,我得到的是以下内容: {"Message abt exception"} [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} - Johan Björk
找到问题了。我有两个服务引用,它们都有CreateFault数据契约。当我运行程序时,它使用了错误的引用。当我改成catch (FaultException ex) 它就可以工作了。 - Johan Björk
你能否将你的解决方案添加为答案并标记为已接受的答案呢?这样,我们就可以看到问题已经得到了解答(而且你可能会得到投票支持 :-))。 - Christian Hayter
好的,我会翻译。只需要等到明天才能按接受答案的按钮。 - Johan Björk
1个回答

5

找到了问题。我有两个Service引用,它们都有CreateFault DataContract。当我运行程序时,它使用了错误的引用。

当我修改为

catch (FaultException<ServiceReference2.CreateFault> ex) 

它成功了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接