如何在调用JSON Web服务时获取exception信息

在.NET 3.5中,我有以下代码:

[WebService(Namespace = "http://kitchenpc.com/schemas/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] public class KitchenPC : System.Web.Services.WebService { [WebMethod] public LogonResult Logon(string username, string password) { //If username and password are not valid... throw new InvalidUsernameOrPasswordException(); } } 

当我调用它时,如果我传入了无效的用户名和密码,则会抛出InvalidUsernameOrPasswordException ,我可以通过查看error.get_exceptionType()来捕获Javascript中的exception。 这是因为Web服务将在JSON中序列化exception信息。

但是,一旦我升级到.NET 4.5,这就破了。 现在,当我传入无效的用户名和密码时,我收到HTTP响应:

 HTTP/1.1 500 Internal Server Error Cache-Control: private Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/7.5 jsonerror: true X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Sat, 24 Nov 2012 22:42:33 GMT Content-Length: 91 {"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""} 

基本上,exception类型丢失并替换为一般错误消息。

导致此行为发生变化的原因是什么,还有一种方法可以在JSON中返回exception信息吗? 几乎我的整个API都依赖于这种行为。

啊,这是一个愚蠢的问题。 只有在您有以下情况时才会显示例外信息

  

在您的web.config中(在 )。 我实际上不确定这是否是.NET 3.5 – > .NET 4.5的行为更改,或者当我使用web.config转换重写web.config构建过程时它是否已损坏。

有谁知道是否有办法在每个网络服务级别上控制这个? 我宁愿不在正常页面请求上显示完整的调试信息。

更新:

我还得出结论,抛出exception以从Web服务传递错误信息实际上并不是一个好的设计。 事实上,我在博客上为感兴趣的人写了一篇关于这个主题的post 。

exception类型不可序列化。 请改用FaultException。

 throw new FaultException(..);