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

时间:2012-11-24 22:46:10

标签: c# asp.net .net web-services asp.net-ajax

在.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中捕获异常。这是因为Web服务将在JSON中序列化异常信息。

然而,一旦我升级到.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":""}

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

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

2 个答案:

答案 0 :(得分:6)

啊,这是一个愚蠢的问题。仅当您具有以下内容时才会显示例外信息:

<customErrors mode="Off" />

在您的web.config中(在<system.web>下)。我实际上不确定这是否是.NET 3.5 - &gt; .NET 4.5改变了行为,或者当我使用web.config转换重写web.config构建过程时它被破坏了。

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

<强>更新

我还得出结论,抛出异常以从Web服务传递错误信息实际上并不是一个好的设计。事实上,我在我的博客上为感兴趣的人写了post on the subject

答案 1 :(得分:0)

异常类型不可序列化。改为使用FaultException。

throw new FaultException(..);