2016-07-05 86 views
2

我需要在我的WebApi的輸出json上顯示添加到自定義異常ModelException的定製屬性。因此,我創建自定義異常類如下使用web api將自定義異常序列化爲JSON

[Serializable] 
public class ModelException : System.Exception 
{ 
    private int exceptionCode; 
    public int ExceptionCode 
    { 
     get 
     { 
      return exceptionCode; 
     } 
     set 
     { 
      exceptionCode = value; 
     } 
    } 

    public ModelException() : base() { } 

    public ModelException(string message) : base(message) { } 

    public ModelException(string format, params object[] args) : base(string.Format(format, args)) { } 

    public ModelException(string message, System.Exception innerException) : base(message, innerException) { } 

    public ModelException(string format, System.Exception innerException, params object[] args) : base(string.Format(format, args), innerException) { } 


    protected ModelException(SerializationInfo info, StreamingContext context) 
     : base(info, context) 
    { 
     if (info != null) 
     { 
      int result = 0; 
      int.TryParse(info.GetString("ExceptionCode"), out result); 
      this.exceptionCode = result; 
     } 
    } 

    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] 
    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     if (info != null) 
     { 
      info.AddValue("ExceptionCode", this.exceptionCode); 
     } 

     base.GetObjectData(info, context); 
    } 

    public ModelException(string message, int exceptionCode) 
     : base(message) 
    { 
     this.exceptionCode = exceptionCode; 
    } 
} 

然後添加以下CONFIGRATION我WebApiConfig

config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; 
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver() 
     { 
      IgnoreSerializableInterface = true 
     }; 

這裏的問題是SerializationInfo參數的新overidden構造不解僱,新的自定義屬性沒有出現在退回Json from WebApi

+0

我用來實現相同的一種機制是使用Web API錯誤過濾器,它可以攔截異常調用,並可用於修改Context.Response,並附帶必要的異常信息,請檢查: http:///www.asp.net/web-api/overview/error-handling/exception-handling –

+0

您不需要設置「IgnoreSerializableInterface = false」嗎? – dbc

+0

@dbc是的我試着設置'IgnoreSerializableInterface = false',但沒有任何工作的自定義屬性doesnt apear –

回答

3

感謝@MrinalKamboj

爲了在Exception的情況下更改Web API的輸出Json。我做了以下修改來解決這個

  1. 實現我Custom Exception (ModelException)在我的問題
  2. 按@MrinalKamboj評論我創建了以下

    public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
    { 
        public override void OnException(HttpActionExecutedContext context) 
        { 
         if (context.Exception is ModelException) 
         { 
          ModelException exception = (ModelException)context.Exception; 
          HttpError error = new HttpError(); 
          error.Add("Message", "An error has occurred."); 
          error.Add("ExceptionMessage", exception.Message); 
          error.Add("ExceptionCode", exception.ExceptionCode); 
          error.Add("ExceptionType", exception.Source); 
          error.Add("StackTrace", exception.StackTrace); 
    
          context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, error); 
         } 
        } 
    } 
    
  3. 屬性寄存器Web API如下

    config.Filters.Add(new NotImplExceptionFilterAttribute()); 
    

這不會是適用的只是實現ISerializable我們需要攔截異常,並使用改變JSON的輸出響應的問題

我想改變輸出json源於Web API的解釋HTTPErorr