2016-04-22 20 views
1

我的WebApi拋出一個內部服務器異常,並在客戶端中,我試圖反序列化返回異常的結果。從JSON字符串反序列化異常

控制器的操作一樣:

try 
{ 
    //Do something... 
} 
catch (Exception ex) 
{ 
    return InternalServerError(ex); 
} 

並在客戶端我做:

var content = response.Content.ReadAsStringAsync().Result; 
var exception = JsonConvert.DeserializeObject<Exception>(content); 

但會拋出異常:

會員 '類名' 不找到。

檢查與Json2csharp的背景下,我得到了以下對象:

public class InnerException 
{ 
    public string Message { get; set; } 
    public string ExceptionMessage { get; set; } 
    public string ExceptionType { get; set; } 
    public string StackTrace { get; set; } 
} 

public class RootObject 
{ 
    public string Message { get; set; } 
    public string ExceptionMessage { get; set; } 
    public string ExceptionType { get; set; } 
    public string StackTrace { get; set; } 
    public InnerException InnerException { get; set; } 
} 

那麼,是ClassName來自哪裏,什麼是反序列化異常的最好方法?

EDIT

要序列我創建從Exception衍生的新的類,並添加以下代碼除外:

protected RequestException(SerializationInfo info, StreamingContext context) 
    { 
    } 

    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] 
    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     base.GetObjectData(info, context); 
    } 

然而,原始異常的詳細信息,特別是內部異常,是丟失。

+0

看起來是序列化的例外是派生類型,因此它比類型異常更多的屬性,爲此它不能被反序列化這樣 - 你必須到解串器提供反序列化異常的確切類型 –

+1

我不知道C#,但通常你不會返回一個原始的服務器端異常到前端 - 因爲你正在捕獲它,爲什麼不返回更友好的用戶界面,而不會暴露你的類名和服務器端堆棧跟蹤? – pherris

+0

你可以發佈你的JSON字符串嗎? – Mainak

回答

1

不要暴露異常本身,使用內部屬性創建自己的響應對象,如果異常填充自己的對象並將其傳遞給響應。在客戶端使用

var content = response.Content.ReadAsStringAsync().Result; 
var response = JsonConvert.DeserializeObject<MyResponseObject>(content);