[注意:我真的在寻找一些好的调试技术。也许是一些技巧或方法来简化我不知道的事情。]
我正在使用JQuery的ASPX页面中定义的[WebMethods]技术,如here和here所述。这似乎是一种越来越常见的方法。
我已经使用了一段时间,总的来说,效果很好。但是开发它时非常脆弱。任何不正确的参数都将导致非常模糊,非特定的错误消息。例如,如果我有一个相当复杂的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);
}
});
答案 0 :(得分:1)
或者是否有一些实用程序会自动构建[WebMethod]调用的JSON参数结构? (就像你可以自动获得Web服务的WSDL一样)
是的! ASP.Net AJAX框架可以做到这一点!您可以使用Web服务类的“GenerateScriptType”属性来获取框架,以便为GeneralData
,SomeObject
和SomeOtherObject
类生成客户端代理类。
有关该主题的非常好的文章,请参阅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”属性是否为空,如果是,我知道发生了错误。