为什么WCF异步方法在同步时不会抛出FaultException?

时间:2017-08-24 15:08:26

标签: c# wcf asynchronous task

我已经用WCF做了一些测试,我不确定理解一件事。

我有以下服务:

public class CommunicationIssuesService :  ICommunicationIssuesService
{
    public void TestExceptionInActionSync()
    {
        throw new InvalidOperationException();
    }

    public async Task TestExceptionInActionAsync()
    {
        throw new InvalidOperationException();
    }
}

具有以下实现:

//Test Synchronous
//... Setup of the channelFactory
ICommunicationIssuesService channel =_channelFactory.CreateChannel()
try{
    channel.TestExceptionInActionSync();
}catch(FaultException<ExceptionDetail>){
    //I receive an FaultException
}

//Test Asynchronous
//... Setup of the channelFactory
ICommunicationIssuesService channel =_channelFactory.CreateChannel()
try{
    channel.TestExceptionInActionAsync();
}catch(AggregateException){
    //I receive an AggregateException, I guess because it's a Task behind   
}

在客户端,我创建了一个ChannelFactory,然后在其上:

{{1}}

我不明白为什么我在这里没有收到FaultException(或AggregateException)?

1 个答案:

答案 0 :(得分:1)

此行为是Async APIs中的设计,您需要使用Task.ResultTask.Wait访问返回的任务,以获取异常,因为这是异步实现,因此{{ 1}}也会这样做。上面提到的调用await TaskWaitResult有助于在尝试访问任务状态时解包任务中的异常,该异常为await并尝试要访问结果,如果有,或者可能只是等待完成,即使它有例外,请检查Task Status

修改您的代码,如下所示:

Faulted