2010-09-21 58 views
3

我有一個c#web服務,我打電話使用jquery ajax。除非在Web方法中引入自定義異常,否則它可以正常工作。出於某種原因,XmlHttpResponse對象的responseText只具有基本Exception類的屬性。所以我最終得到了一個具有以下屬性的json對象:「ExceptionType」,「Message」和「StackTrace」如何序列化一個自定義異常到c#中的json

我的自定義異常有一個名爲「FieldErrors」的屬性,它不會顯示在返回中。這裏是該類的代碼:

[Serializable] 
[XmlRootAttribute(Namespace = "http://www.mydomain.com/", IsNullable = false)] 
public class ValidationException : Exception 
{ 
    public List<string> FieldErrors { get; set; } 
    public ValidationException(string message = null, Exception innerException = null) : base(message: message, innerException: innerException) 
    { 
     this.FieldErrors = new List<string>(); 
    } 
} 

我的目標是讓「FieldErrors」屬性顯示在json響應中。

+0

我從來沒有使用JSON的東西,但它有幫助,如果你使用'SoapException'? – 2010-09-21 21:07:10

+0

嗨。它似乎SoapException不會幫助:(。我仍然沒有看到自定義屬性 – fehays 2010-09-21 21:12:00

回答

3

不要這樣做。你不應該暴露你的asp.net網站的異常。

即使它最終隱藏給用戶,你仍然將它的所有細節發送給客戶端。

在這種情況下,您實際上想要控制將要發送的內容,因此明確發送字段錯誤列表而不發送整個異常實例的json版本是您應該做的。

+0

謝謝。好建議。我仍然想知道如何做到這一點。這帶來了另一個問題,我如何返回列表的字段錯誤,並能夠處理Ajax的「錯誤」回調?我必須在返回錯誤之前手動設置響應代碼爲500? – fehays 2010-09-24 15:11:44

+0

是的,您將響應代碼設置爲500以指示調用者錯誤。一些有點不相關/不太可能的情況,但我想補充一點:如果你碰巧在解密請求中的任何內容,確保響應是完全相同的,當API無法解密(由於填充),因爲它失敗,因爲解密後的值是垃圾,這就是填充oracle的漏洞,如果這樣做,最好添加一個簽名。 – eglasius 2010-09-24 15:19:00