3

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

4

2 回答 2

6

啊,这是一个愚蠢的问题。仅当您具有以下条件时才会出现异常信息:

<customErrors mode="Off" />

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

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

更新:

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

于 2012-11-24T22:59:47.467 回答
0

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

throw new FaultException(..);
于 2012-11-24T22:57:53.220 回答