c# - 调用JSON web服务时如何获取异常信息

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

最佳答案

啊,这是一个愚蠢的问题。仅当您有以下情况时才会显示异常信息:

<customErrors mode="Off" />

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

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

更新:

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

关于c# - 调用JSON web服务时如何获取异常信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546429/

相关文章:

c# - 为什么自定义配置部分的 StringValidator 总是失败?

c# - 如何在检查文件是否存在后删除文件

c# - 由于 PreviewMouseLeftButtonDown,Datagrid 内的按钮未被触发

.net - 在共享主机上加密 web.config

c# - 捕获特定的 MySQL 错误 (C#)

javascript - 免费 JavaScript 工具栏菜单

c# - 为什么 ToUpper 比 ToLower 快?

c# - 如何判断何时在 VBA 窗口中

c# - 资源文件 (.resx) 与反射访问嵌入式资源

c# - C# 中的原子读-修改-写