首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在WCF的FaultContract中包含实际异常或自定义异常

如何在WCF的FaultContract中包含实际异常或自定义异常
EN

Stack Overflow用户
提问于 2016-04-07 23:08:14
回答 1查看 1K关注 0票数 0

我想在WCF的FaultContract中包含一个用户定义的异常。在我的WCF应用程序中,我想将异常实例/用户定义异常实例封装在FaultContract中。请查找我的以下UserDefine例外。

代码语言:javascript
复制
public class UserExceptions : Exception
{
    public string customMessage { get; set; }

    public string Result { get; set; }

    public UserExceptions(Exception ex):base(ex.Message,ex.InnerException)
    {

    }
}

public class RecordNotFoundException : UserExceptions
{
    public RecordNotFoundException(Exception ex): base(ex)
    {

    }
}

public class StoredProcNotFoundException : UserExceptions
{
    public string innerExp { get; set; }

    public StoredProcNotFoundException(Exception ex,string innerExp)
        : base(ex)
    {
        this.innerExp = innerExp;
    }
}

[DataContract]
public class ExceptionFault
{ 
    [DataMember]
    public UserExceptions Exception { get; set; }

    public ExceptionFault(UserExceptions ex)
    {
        this.Exception = ex;
    }
}

在服务中抛出异常,如下所示

代码语言:javascript
复制
try
        {
            //Some Code
            //Coding Section 
                    throw new RecordNotFoundException(new Exception("Record Not Found"));
            //Coding Section
        }
        catch (RecordNotFoundException rex)
        {
            ExceptionFault ef = new ExceptionFault(rex);
            throw new FaultException<ExceptionFault>(ef,new FaultReason(rex.Message));
        }
        catch (Exception ex)
        {
            throw new FaultException<ExceptionFault>(new ExceptionFault((UserExceptions)ex),new FaultReason(ex.Message));
        }

尝试块捕获CustomException(RecordNotFoundException),但它无法将异常发送到客户端。

EN

回答 1

Stack Overflow用户

发布于 2016-04-07 23:14:49

您需要将FaultContract属性添加到OperationContract方法中,以便SOAP客户端知道需要异常类型

代码语言:javascript
复制
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);

catch块需要捕获FaultException<T>

代码语言:javascript
复制
catch (FaultException<MathFault> e)
{
    Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType);
    client.Abort();
}

最好为每种异常类型都有一个DataContract,而不是试图将它们都包装到一个DataContract

代码语言:javascript
复制
[DataContract]
public class MathFault
{    
    private string operation;
    private string problemType;

    [DataMember]
    public string Operation
    {
        get { return operation; }
        set { operation = value; }
    }

    [DataMember]        
    public string ProblemType
    {
        get { return problemType; }
        set { problemType = value; }
    }
}

如果您希望在DataContract中包含UserExceptions的实现,则可能需要使用KnownType属性,以便SOAP客户端能够识别这些类型:

代码语言:javascript
复制
[DataContract]
[KnownType(typeof(RecordNotFoundException))]
[KnownType(typeof(StoredProcNotFoundException))]
public class ExceptionFault
{ 
    [DataMember]
    public UserExceptions Exception { get; set; }

    public ExceptionFault(UserExceptions ex)
    {
        this.Exception = ex;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36480237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档