从 JQuery 调用的 ASP.Net [WebMethod] 获取更好的错误消息

Posted

技术标签:

【中文标题】从 JQuery 调用的 ASP.Net [WebMethod] 获取更好的错误消息【英文标题】:Getting Better Error Message From ASP.Net [WebMethod] Called From JQuery 【发布时间】:2010-12-01 16:17:01 【问题描述】:

[注意:我真的在这里寻找一些好的调试技术。也许有一些技巧或方法可以简化我不知道的事情。]

如here 和here 所述,我正在使用从JQuery 调用在ASPX 页面中定义的[WebMethods] 的技术。这似乎是一种越来越普遍的方法。

我已经使用了一段时间了,总的来说,它工作得很好。但是在开发时它非常脆弱。任何不正确的参数都会导致非常模糊、不具体的错误消息。例如,如果我有一个相当复杂的 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。这只是一个例子,可能还有一百个其他细微的错字式错误中的任何一个。

如果我从 C# 调用此方法,编译器会给我一条错误消息,例如“SaveComplexRecord 的重载方法不接受三个参数”。或其他一些有用的信息,为您指明正确的方向。

那么...有没有办法让 ASP.Net 在这里产生更好的错误消息?

或者是否有一些实用程序可以自动构建 [WebMethod] 调用的 JSON 参数结构? (就像您可以自动获取 Web 服务的 WSDL)

...或我可能遗漏的任何其他技术?

为了完整起见,这里是我从 JQuery 中调用这些 WebMethods 的方式:

   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);
        

    );

【问题讨论】:

有点不相关,但我建议使用 JSON.stringify 而不是 $.toJSON。在现代浏览器中,JSON.stringify 将自动利用更快的浏览器原生功能,而不是通过 javascript 引擎对其进行序列化。 【参考方案1】:

或者是否有一些实用程序可以自动构建 [WebMethod] 调用的 JSON 参数结构? (就像您可以自动获取 Web 服务的 WSDL)

是的! ASP.Net AJAX 框架可以做到这一点!您可以让框架使用 Web 服务类上的“GenerateScriptType”属性为GeneralDataSomeObjectSomeOtherObject 类生成客户端代理类。 请参阅understanding asp net ajax web servcies 了解有关该主题的非常好的文章。

[不幸的是,AFAIAA,GenerateScriptType 在应用于定义页面方法的 Page 类时无效 - 因此您必须添加 .asmx 纯粹以获取代理生成。]

您也许可以使用这些类来构建data 结构,然后在调用.ajax 时将其JSON 字符串化? [我真正喜欢 MS AJAX 框架的(极少数)事情之一是客户端代理生成:它确实使调用 Web 服务和页面方法变得非常容易。话虽如此,我也倾向于使用 jQuery 而不是 MS AJAX。]

或者... 您的问题实际上是,将 JSON 数据反序列化为页面方法的参数是由框架透明地完成的(这在大多数情况下是一件好事)但是当它出错时,您得到的反馈少于- 有帮助。如果您想捕获反序列化问题,那么我认为您必须通过使用自定义 JSON 转换器(请参阅here)或使用相当不雅的大锤方法让您的方法接受字符串并反序列化来控制序列化方法中的 JSN - 这对于众多 JSON 库中的任何一个来说都是微不足道的。

【讨论】:

迄今为止的最佳答案,将继续并标记为已接受。我之前采用了“只接受一个字符串”(或只接受一个 Dictionary)路径。它有效,但不如正确完成。我想过以某种方式使用 ASP.Net AJAX 框架来生成代理类......但还没有深入研究它以弄清楚如何。【参考方案2】:

Javascript 是动态类型的,因此您不会收到编译时错误。但是您可以使用旧的 window.onerror + ajax 技巧(或通过 ajax 在 jQuery.ajax() 的回调中通过 ajax 发送错误),一旦您在服务器中,您可以像对待任何其他运行时错误一样对待它(抛出异常,记录错误,无论如何)

【讨论】:

【参考方案3】:

从 jQuery 的角度来看,您的问题在于错误函数声明。只取一个入参,就具备了报错的所有属性,调试起来更方便。

如果问题出在服务器端,则在此处捕获错误,并创建包含错误消息的返回 json。

哦,如果您确实想在编译时检查您的 javascript,我建议您使用来自 jslint.com 的插件。

所以:

$.ajax( 类型:“发布”, url: "MyWebPage.aspx/SaveComplexRecord", 数据:json数据, contentType: "应用程序/json; charset=utf-8", 数据类型:“json”, 发送前:函数(xhr) xhr.setRequestHeader("内容类型", “应用程序/json;字符集=utf-8”); , 成功:功能(味精) //成功时做某事 , 错误:函数(错误) 警报(例如消息); );

【讨论】:

【参考方案4】:

当从 Web 服务返回 JSON 时,我所做的是拥有一个名为“ret”的对象,其中包含一个属性“err”以及包含服务调用结果的属性“data”。在 Web 服务内部,我捕获所有异常并将异常消息放在“err”属性上。然后在客户端中检查“err”属性是否为非空,如果我知道发生了错误。

【讨论】:

以上是关于从 JQuery 调用的 ASP.Net [WebMethod] 获取更好的错误消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 调用 ASP.NET Web 服务?

使用 jquery ajax 从 asp.net 网页表单页面调用 web api url

ASP.NET jQuery 错误:未知的 Web 方法

如何使用jQuery调用带有参数的asp.net asmx web服务来获取响应

使用 Jquery AJAX 从 ASP.NET Web 服务器获取对象

通过 jQuery 调用 ASP.NET 服务器端方法