【问题标题】:WCF: can't catch FaultException(TDetail) - only non-generic FaultExceptionWCF:无法捕获 FaultException(TDetail) - 只有非泛型 FaultException
【发布时间】:2014-08-15 08:46:56
【问题描述】:

我在服务器上抛出 FaultException,但它没有被客户端捕获。客户端只能捕获不公开 Detail 的非泛型 FaultException。

有什么想法可能遗漏或错误吗?

我的服务合同:

[ServiceContract]
public interface IServicoLoja
{
    [OperationContract]
    [FaultContract(typeof(RetornoErro))]
    Retorno<Guid> AdicionarOuAlterar(Loja req);
}

实现:

[ServiceBehavior]
public class ServicoLoja : IServicoLoja
{
    public Retorno<Guid> AdicionarOuAlterar(Modelo.Loja req)
    {
        try
        {
            ......
        }
        catch (Exception ex)
        {
            var ret = new RetornoErro(ex);
            throw new FaultException<RetornoErro>(ret, ex.Message);
        }
        .....
    }
}

服务代理:

public class ServicoLojaClient : ClientBase<IServicoLoja>, IServicoLoja
{
    public Retorno<Guid> AdicionarOuAlterar(Loja req)
    {
        return Channel.AdicionarOuAlterar(req);
    }
}

在客户端:

try
{
    ...
}
catch (FaultException<RetornoErro> ex)
{
    //this is not reached
}
catch(FaultException ex)
{
    //this is reached
}

服务合同位于客户端引用的单独程序集上。还引用了包含“RetornoErro”的程序集。

谢谢。

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    我发现了问题:

    RetornoErro 有一个带有 [DataMember] 且没有 setter 的属性,所以我猜它不能被反序列化。

    【讨论】:

    • 如果您尝试使用IServiceBehavior/IErrorHandler 将正常异常转换为FaultExceptions,而不在引发异常的方法上使用FaultContract,也会出现此问题。如果没有[FaultContract(typeof(TDetail))]FaultContract&lt;TDetail&gt; 在客户端会丢失其类型参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多