2016-04-07 6 views
0

Я хотел бы включить исключение пользователя в исключение FaultContract из WCF. В моем приложении WCF я хотел бы инкапсулировать экземпляр Exception/экземпляр исключения UserDefine в FaultContract. Пожалуйста, найдите мое нижнее исключение UserDefine.Как включить фактическое исключение или пользовательское исключение в FaultContract из WCF

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 StoreProcNotFoundException : UserExceptions 
{ 
    public string innerExp { get; set; } 
    public StoreProcNotFoundException(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; 
    } 
} 

И я бросить исключение в службы, как показано ниже

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), но не в состоянии послать это исключение к клиенту.

ответ

0

Вам нужно добавить атрибут FaultContract к вашим OperationContract методы, чтобы клиент SOAP знает ожидать тип исключения

[OperationContract] 
[FaultContract(typeof(MathFault))] 
int Divide(int n1, int n2); 

Ваш улов блок должен поймать FaultException<T>

catch (FaultException<MathFault> e) 
{ 
    Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType); 
    client.Abort(); 
} 

Его лучше всего имеют DataContract для каждого типа исключения, вместо того, чтобы пытаться объединить их все в один DataContract

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

Если вы хотите включить реализацию UserExceptions в вашем DataContract то вам, возможно, придется использовать атрибут KnownType так, чтобы клиент SOAP осведомлен о типах:

[DataContract] 
[KnownType(typeof(RecordNotFoundException))] 
[KnownType(typeof(StoreProcNotFoundException))] 
public class ExceptionFault 
{ 
    [DataMember] 
    public UserExceptions Exception { get; set; } 

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

Спасибо Glen за ваш быстрый ответ, однако Я хотел бы включить оригинальное исключение в свой FaultContract (MathFault в вашем примере), чтобы клиент мог получить фактическое исключение и другие пользовательские данные, такие как Operation and Problem. – Sourabh

+0

Короче говоря, я хотел бы сериализовать фактическое исключение и отправить его клиенту через провод. – Sourabh

+0

@ Сураб Ах, я вижу. С помощью службы SOAP вы можете передавать только пользовательские типы, о которых клиент знает через DataContract. Добавление атрибута KnownType может помочь в этом. –

 Смежные вопросы

  • Нет связанных вопросов^_^