【问题标题】:How to get exception information when calling JSON web service调用 JSON Web 服务时如何获取异常信息
【发布时间】:2012-11-12 20:13:16
【问题描述】:

在 .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 都是为依赖这种行为而设计的。

【问题讨论】:

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


    【解决方案1】:

    啊,这是一个愚蠢的问题。仅当您满足以下条件时才会显示异常信息:

    <customErrors mode="Off" />
    

    在您的 web.config 中(在 &lt;system.web&gt; 下)。实际上,我不确定这是 .NET 3.5 -> .NET 4.5 的行为变化,还是在我使用 web.config 转换重写 web.config 构建过程时发生了故障。

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

    更新:

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

    【讨论】:

      【解决方案2】:

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

      throw new FaultException(..);
      

      【讨论】:

      • 是的。抱歉,我没有注意到那些不是 WCF。 :)
      • 是的,这些天我需要切换到 WCF.. 它更强大。不过我现在只需要解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 2015-12-27
      • 2012-03-25
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多