2009-09-26 77 views
4

[注:我真的在這裏尋找一些好的調試技術。也許一些技巧或方法來簡化事情的,我不知道。]從ASP.Net獲取更好的錯誤信息[WebMethod]從JQuery調用

我使用調用[的WebMethod]的技術提到herehere在ASPX頁面定義從JQuery的。這似乎是一種越來越普遍的方法。

我已經使用了一段時間,在一般情況下,它的偉大工程。但是,開發它很脆弱。任何不正確的參數都會導致一個非常模糊的,非特定的錯誤消息。舉例來說,如果我有一個相當複雜的Web方法定義爲:

[WebMethod] 
public static string SaveComplexRecord(int recID, GeneralData general, SomeObject data, SomeOtherObject moreData) 
{ 
    //do a bunch of stuff with that data 
} 

而且GeneralData,SomeObject和SomeOtherObject都有各種參數的搭配是非常(字符串,整數,布爾變量,日期時間。)很可能,特別是在最初的開發過程中,我會在客戶端錯誤地構建JSON。也許我會做到這一點:

var data = { 
    recID: curID, 
    general: 
    { 
     a: aValue, 
     b: bValue, 
     c: cValue 
    }, 
    data: 
    { 
     d: dValue, 
     e: eValue, 
     f: fValue 
    }, 
    moredata: 
    { 
     g: gValue, 
     h: hValue, 
     i: iValue 
    } 
}; 

這將導致一個錯誤,因爲第三個參數的名稱是MOREDATA,不MOREDATA。這只是一個例子,可能有其他100種微妙的錯字式錯誤。

如果我打電話從C#這種方法,編譯器會給我一個錯誤消息類似「SaveComplexRecord沒有重載的方法有三個參數。」或一些其他有用的信息,指出你在正確的方向。

所以...有沒有讓ASP.Net在這裏產生更好的錯誤信息的一種方式?

或者是否有一些實用程序會自動構建[WebMethod]調用的JSON參數結構? (就像你可以自動獲得一個Web服務的WSDL)

......或者說,我可能會丟失任何其他技術?

而對於完整性這裏是我如何把這些從的WebMethods JQuery的:

var jsondata = $.toJSON(data); 

    $.ajax({ 
     type: "POST", 
     url: "MyWebPage.aspx/SaveComplexRecord", 
     data: jsondata, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     beforeSend: function(xhr) 
     { 
      xhr.setRequestHeader("Content-type", 
         "application/json; charset=utf-8"); 
     }, 
     success: function(msg) 
     { 
      //do something on success 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) 
     { 
      alert("ERROR status:" + textStatus + " error:" + errorThrown); 
     } 

    }); 
+2

有點不相關,但我會建議使用JSON.stringify而不是$ .toJSON。在現代瀏覽器中,JSON.stringify將自動利用更快的瀏覽器本地功能,而不是通過JavaScript引擎對其進行序列化。 – 2009-10-26 15:21:03

+0

很酷。沒有意識到這一點。 – 2009-10-27 16:58:14

回答

1

Or is there some utility that will automatically build the JSON parameter structure of a [WebMethod] call? (just like you can automatically get the WSDL of a web service)

是的! ASP.Net AJAX框架可以做到這一點!您可以使用Web服務類上的'GenerateScriptType'屬性來獲取框架,以生成GeneralData,SomeObjectSomeOtherObject類的客戶端代理類。
請參閱understanding asp net ajax web servcies以獲取關於此主題的非常好的文章。

[不幸的是,AFAIAA的GenerateScriptType已經在應用到哪裏定義您的頁面方法Page類沒有影響 - 所以你必須純屬添加的.asmx讓代理代]

你可以也許可以使用這些類來建立data結構,然後當您致電.ajax時,JSON將進行串聯操作? [我非常喜歡MS AJAX框架的一些(很少)事情是客戶端代理生成:它確實使調用Web服務和頁面方法變得非常簡單。話雖如此,我也是對優先於MS AJAX使用jQuery移動]

或可替代... 你的問題真的是JSON數據到您的網頁方法的參數的反序列化完成透明地通過框架(在大多數情況下這是一件好事),但是當它出錯時,你得到的反饋並不是很有幫助。如果你想捕捉反序列化問題,那麼我認爲你必須通過使用定製的JSON轉換器(參見here)或者使用相當不雅的大錘方法讓你的方法接受一個字符串並將JSN序列化來控制序列化你自己在方法中 - 這對於那些衆多JSON庫中的任何一個都是微不足道的。

+0

迄今爲止的最佳答案,將繼續並標記爲已接受。我採取了「只接受一個字符串」(或接受一個字典<字符串,對象>)路徑。它的工作原理,但並不像做對的那麼好。我想了一下使用ASP.Net AJAX框架來生成代理類...但沒有深入研究如何解決這個問題。 – 2010-11-09 20:11:39

0

JavaScript是動態類型的,所以你不能得到一個編譯時錯誤。但是你可以使用舊window.onerror + ajax伎倆(或通過AJAX在error回調jQuery.ajax()發送錯誤),一旦你的服務器是你可以把它像任何其他運行時錯誤(拋出一個異常,記錄錯誤,不管)

0

從jQuery的角度來看,你的問題在錯誤函數聲明中。只需要一個輸入參數,並且將具有錯誤的所有屬性,那麼您可以更容易地進行調試。

如果問題是服務器端,捕捉錯誤,並創建包含錯誤信息返回JSON。

哦,如果你想在編譯時檢查你的javascript,我推薦從jslint.com加載。

所以:

$阿賈克斯({ 類型: 「POST」, 網址:「MyWebPage。aspx/SaveComplexRecord「, data:jsondata, contentType:」application/json;字符集= UTF-8" , 數據類型: 「JSON」, beforeSend:功能(XHR) { xhr.setRequestHeader( 「內容類型」, 「應用程序/ JSON;字符集= UTF-8」);} , 成功:函數(MSG) {// 做成功 東西}, 錯誤:函數(ERR) { 警報(e.message);} });

0

我做什麼當從Web服務返回JSON時,有一個名爲「ret」的對象,其中包含屬性「err」以及a賦予包含服務調用結果的「數據」。在Web服務內部,我捕獲任何異常並將異常消息放在「err」屬性上。然後在客戶端中,我檢查「err」屬性是否爲空,如果是,我知道發生了錯誤。