如何在C#中将自定义异常序列化为JSON

4
我有一个 C# Web 服务,我使用 jQuery Ajax 调用。它正常工作,除非在 web 方法中抛出自定义异常。由于某些原因,XmlHttpResponse 对象的 responseText 只具有基础 Exception 类的属性。因此,最终得到的 JSON 对象只包含以下属性:"ExceptionType"、"Message" 和 "StackTrace"。
我的自定义异常有一个名为 "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响应中。


我从没用过 JSON 的相关内容,但如果你使用 SoapException 会有帮助吗? - John Saunders
嗨。看起来SoapException没有帮助:(。我仍然看不到自定义属性。 - fehays
1个回答

4

不要这样做。您永远不应该从您的asp.net站点公开异常。

即使它最终对用户隐藏,您仍然将其与所有详细信息发送到客户端。

在这种情况下,您实际上想要控制将要发送的内容,因此明确地发送字段错误列表而不发送整个异常实例的json版本是您应该执行的操作。


谢谢。好建议。虽然如此,我仍然想知道怎么做。这带出了另一个问题,如何返回字段错误列表并能够在ajax的"error"回调中处理它?在返回错误之前,我必须手动设置响应代码为500吗? - fehays
是的,您可以将响应代码设置为500,以向调用者指示错误。还有一些不太相关/不太可能的情况,但我想补充一下:如果您在请求中解密任何内容,请确保在API无法解密(因为填充)与解密值是垃圾时失败时,响应完全相同。这就是填充Oracle漏洞的原因。此外,如果要这样做,最好添加签名。 - eglasius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接