使用jQuery调用WebService持续返回0错误,寻求解决方案
嘿,我看你折腾了半天各种配置还是没法调用那个ASMX服务,不过好在有.NET能正常调用的参考,咱们先从你贴的代码入手找问题:
1. 先把代码的语法坑填上
你写的AJAX代码里data对象没闭合,还漏了几个必填参数(name、subject、emailFrom),最后连闭括号都没写完,这肯定跑不起来啊!先把语法补全:
$('#btnCallService').click(function () { $.ajax({ type: 'POST', url: 'http://asr.eduka.info/webservice/ASREmployeeTransfer.asmx/SendEmail', dataType: 'text', data: { "message": "hello world.", "phone": "2342342...", "name": "Patrick Gan", "subject": "Test", "emailFrom": "fspatrick@hotmail.com" } }); });
2. 适配ASMX服务的请求格式
ASMX服务对请求格式是有要求的,默认它认application/x-www-form-urlencoded,不过如果服务端开了JSON支持,用JSON格式更稳妥。我给你两种可行的配置:
方案一:Form-UrlEncoded格式(和.NET调用的格式对齐)
jQuery会自动把data里的对象转成form格式,你只需要确保参数名和服务端的SendEmail方法参数完全一致:
$('#btnCallService').click(function () { $.ajax({ type: 'POST', url: 'http://asr.eduka.info/webservice/ASREmployeeTransfer.asmx/SendEmail', dataType: 'text', data: { "message": "hello world.", "phone": "2342342...", "name": "Patrick Gan", "subject": "Test", "emailFrom": "fspatrick@hotmail.com" } }) .done(function(res) { console.log("成了!返回内容:", res); }) .fail(function(xhr, err) { console.error("凉了:", err); // 这里可以看服务返回的具体错误,很有用 console.log("服务返回的错误详情:", xhr.responseText); }); });
方案二:JSON格式(更清晰,适合复杂参数)
如果服务端支持JSON,直接用这个格式,记得要显式设置contentType,还要把数据序列化成JSON字符串:
$('#btnCallService').click(function () { $.ajax({ type: 'POST', url: 'http://asr.eduka.info/webservice/ASREmployeeTransfer.asmx/SendEmail', contentType: "application/json; charset=utf-8", // 这个必须加 dataType: 'json', // 如果服务返回JSON就用这个,text也可以 data: JSON.stringify({ "message": "hello world.", "phone": "2342342...", "name": "Patrick Gan", "subject": "Test", "emailFrom": "fspatrick@hotmail.com" }) }) .done(function(res) { console.log("调用成功!返回:", res.d); // ASMX返回的JSON通常包在d属性里 }) .fail(function(xhr, err) { console.error("调用失败:", err); console.log("服务错误信息:", xhr.responseText); }); });
3. 排查跨域问题
如果你的页面和asr.eduka.info不是同一个域名,那肯定会有跨域问题!.NET应用可能是同域调用或者已经配置了CORS,而前端AJAX需要服务端开启跨域支持(比如在ASMX服务里加响应头,或者改Web.config)。你可以打开浏览器的开发者工具,看Console面板有没有跨域相关的报错,或者Network面板里的请求是不是直接被拦截了。
4. 确认服务的权限和参数匹配
别忘了检查ASMX服务的SendEmail方法是不是加了[WebMethod]标记,参数名和你传的要完全一致(虽然ASMX默认不区分大小写,但尽量对齐不容易错)。另外,如果.NET调用的时候需要传凭证(比如Cookie、Token),那你的AJAX也要对应加上,比如用xhrFields: { withCredentials: true }配置。
最后,强烈建议你用浏览器的开发者工具抓请求,看请求的状态码、参数有没有传对、服务返回的具体内容,这些信息能帮你快速定位问题!
内容的提问来源于stack exchange,提问作者Rich

