2012-11-24 38 views
3

在.NET 3.5時,得到的異常信息,我有以下代碼:如何調用JSON Web服務

[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被設計爲依賴這種行爲。

回答

6

啊,這是一個愚蠢的問題。異常信息纔會出現,如果您有:

<customErrors mode="Off" /> 

在你的web.config(<system.web>下)。我實際上不確定這是否是.NET 3.5 - > .NET 4.5中的行爲改變,或者當我使用web.config轉換重新編寫web.config構建過程時發生中斷。

有沒有人知道是否有一種方法可以在每個Web服務級別上進行控制?我寧願不顯示正常頁面請求上的完整調試信息。

更新:

我也來的結論是,拋出異常從Web服務通信錯誤信息實在不是一個好的設計。事實上,我在我的博客上爲有興趣的人寫了一個post on the subject

0

異常類型不可序列化。改用FaultException。

throw new FaultException(..); 
+0

我指的是JSON Web服務,而不是SOAP。但是,謝謝! –

+0

是的。對不起,我沒有注意到它不是WCF。 :) – SmartK8

+0

是的,這些天我需要切換到WCF ..這是更強大。我現在只需要這個固定的。 –