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

时间:2009-09-26 16:06:13

标签: c# asp.net jquery web-services

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

我正在使用JQuery的ASPX页面中定义的[WebMethods]技术,如herehere所述。这似乎是一种越来越常见的方法。

我已经使用了一段时间,总的来说,效果很好。但是开发它时非常脆弱。任何不正确的参数都将导致非常模糊,非特定的错误消息。例如,如果我有一个相当复杂的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);
        }

    });

4 个答案:

答案 0 :(得分: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数据反序列化到页面方法的参数中是由框架透明地完成的(在大多数情况下这是一件好事)但是当它出错时,您得到的反馈小于-helpful。如果你想捕获反序列化问题,那么我认为你必须通过使用自定义JSON转换器(参见here)或使用相当不优雅的大锤方法来控制序列化,让方法接受字符串和在方法中自己序列化JSN - 这对于众多JSON库中的任何一个都是微不足道的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

从jQuery的角度来看,你的问题出在错误函数声明中。只需要一个输入参数,并且该参数将具有错误的所有属性,那么您可以更轻松地进行调试。

如果问题是服务器端,请在那里捕获错误,并创建包含错误消息的返回json。

哦,如果你想在编译时检查你的javascript,我推荐jslint.com的加载项。

所以:

$。AJAX({         类型:“POST”,         url:“MyWebPage.aspx / SaveComplexRecord”,         数据:jsondata,         contentType:“application / json; charset = utf-8”,         dataType:“json”,         beforeSend:function(xhr)         {             xhr.setRequestHeader(“内容类型”,                          “application / json; charset = utf-8”);         },         成功:功能(msg)         {             //做一些成功的事情         },         错误:功能(错误)         {             警报(e.message);         } });

答案 3 :(得分:0)

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