请教jquery ajax json的500 Internal Server Error问题

2010年11月 PHP大版内专家分月排行榜第二2010年10月 PHP大版内专家分月排行榜第二2010年7月 PHP大版内专家分月排行榜第二2009年8月 PHP大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。1275人阅读
& & & & &ASP.NET MVC 引入的WebApi自然且较好地满足了ajax的交互需求,但使用jQuery ajax调用WebApi返回500 Internal Server Error时却不太好查找错误。在一个实际项目中,WebApi方法全部使用了try-catch捕获异常,并返回定制的错误消息,想当然认为有错误就能捕获。但最近网站运行时却总是有500错误,花了一番功夫才发现问题所在。
& & & & 经过多次调试,确定这个错误应该是WebApi方法之外引发的(方法内部应该被try-catch捕获)。初步判断,是在ASP.NET MVC框架的JSON序列化返回对象时引发的一个运行时错误。于是,使用Newtonsoft.Json.JsonConvert.SerializeObject()方法序列化待返回的对象就发现了错误所在:一个类对象的get属性(派生值)中出现被0除的情况。一般而言,对象的get属性仅仅在访问该属性时才运行其中的代码。显然,JSON序列化对象时调用了对象所有的get属性代码并获得持久属性值。
& & & &结论:
WebApi在返回JSON数据时的序列化操作产生的异常,是WebApi方法之外的异常,暂时不能被捕获(.NET Framework 4.0下笔者暂时没有找到捕获的方法),此时将返回500 Internal Server Error错误。JSON序列化对象时,将获取该对象的所有的get属性值(即运行get属性的代码)。可以编程模拟JSON的序列化操作,从而直接抛出并捕获该异常。
& & &&本文介绍的方法在Visual Studio Community 2015、 .NET 4.0和ASP.NET MVC4上调试通过。
& & &&&&后记:
& & & 经过数天的网查调试,找到了一个通用的、捕获WebApi方法Json序列化产生异常的方法,基本思路:定制ASP.NET MVC默认的Json序列化转换器JsonConverter(该类由Newtonsoft动态库提供),在读写序列化流时捕获异常。
& & & 重写的JsonConverter转换器类代码如下:
using System.Net.Http.F
using System.Threading.T
using Newtonsoft.J
using System.IO;
using System.Net.H
using System.N
namespace CSUST.Kyz
public class TJsonConverter : MediaTypeFormatter
public TJsonConverter()
SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue(&application/json&));
public override bool CanWriteType(Type type)
public override bool CanReadType(Type type)
public override Task&object& ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
var task = Task&object&.Factory.StartNew(() =&
using (var sr = new StreamReader(readStream, System.Text.Encoding.UTF8))
json = sr.ReadToEnd();
sr.Close();
return JsonConvert.DeserializeObject(json);
catch(Exception err)
TLogs.Save(&read except:& + err.StackTrace);
// 保存异常信息
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
var task = Task.Factory.StartNew(() =&
var json = JsonConvert.SerializeObject(value);
byte[] buf = System.Text.Encoding.UTF8.GetBytes(json);
writeStream.Write(buf, 0, buf.Length);
writeStream.Flush();
catch(Exception err)
TLogs.Save(&write except:& + err.StackTrace);
// 保存异常信息
}& & & &还需要在全局配置文件中注册上述定制的Json序列化转换器,代码如下(Global.asax.cs中的函数):
protected void Application_Start()
& & AreaRegistration.RegisterAllAreas();
& & WebApiConfig.Register(GlobalConfiguration.Configuration);
& & FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
& & RouteConfig.RegisterRoutes(RouteTable.Routes);
& & GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
// 清除全部数据格式
& & GlobalConfiguration.Configuration.Formatters.Insert(0, new TJsonConverter());
// 只有定义序列化器及Json格式
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:408582次
积分:4982
积分:4982
排名:第5564名
原创:87篇
评论:482条
(3)(2)(1)(1)(1)(1)(1)(1)(2)(3)(1)(1)(2)(3)(1)(1)(1)(1)(1)(2)(1)(1)(1)(1)(1)(1)(1)(1)(3)(2)(1)(2)(2)(1)(1)(1)(1)(1)(1)(3)(2)(6)(9)(7)(7)(3)2009年10月 .NET技术大版内专家分月排行榜第三
2009年10月 .NET技术大版内专家分月排行榜第三
2009年10月 .NET技术大版内专家分月排行榜第三
2009年10月 .NET技术大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。jQuery中ajax错误调试分析_jquery
jQuery中把ajax封装得非常好。但是日常开发中,我偶尔还是会遇到ajax报错。这里简单分析一下ajax报错
一般的jQuery用法如下,ajax通过post方式提交"汤姆和老鼠"这段数据到xxx.php文件中。成功后则打印返回的数据,失败则打印错误原因。
url:"xxx.php",
type:"post",
datatype:"json",
data:{"cat":"tom","mouse":"jack"},
success:function(data){
console.log(data);
error:function(jqXHR,textStatus,errorThrown){&br& console.log(jqXHR.);&br& console.log(textStatus);&br& console.log(errorThrown);&br& }
根据jQuery官方,ajax中error有三个参数,分别是 jqXHR,textStatus,errorThrown。
而jqXHR中也有四个属性,
1.readyState :当前状态,0-未初始化,1-正在载入,2-已经载入,3-数据进行交互,4-完成。
:返回的HTTP状态码,比如常见的404,500等错误代码。
3.statusText :对应状态码的错误信息,比如404错误信息是not found,500是Internal Server Error。
4.responseText :服务器响应返回的文本信息
textStatus和errorThrown都是字符串类型,分别是返回的状态和服务器的错误信息。
一般情况下,ajax走进error的函数里,把textStatus和jqXHR.readyState打印出来,大概就知道为什么ajax报错了。如果还是不清楚的话,就把所有参数都打印出来。
这里总结一下ajax错误遇到的情况,以后遇到新的特殊情况再补充。
问题:前端使用jQuery框架,用到ajax与后端交互,后端是php+mysql。发现ajax报错(ajax采用post类型,json格式,请求数据为Json对象),打印textStatus是“parsererror”,意为解析错误。
处理:这个打印说明ajax已经与后端(服务器端)交互成功,后端响应并返回了文本信息。但是前端接受到这个文本后解析错误。这时候我首先需要看到后端响应的文本信息。有两种方式,一种是打印jqXHR.responseText,第二种在谷歌浏览器(其他浏览器也可以)F12下NetWork查看。这时候看到的信息是 5{“status”:“success”}
。不难看出,这个文本中包含了一个json对象的数据,但是不是一个完整json数据。错误发现了,直接去php文件修改相应信息,把多余的打印去除。解决问题。 另外,一个不合格的json对象数据也会导致该问题。例如{'status':'success'}数据中是单引号。
问题:前端使用jQuery框架,用到ajax与后端交互,然后让后端操作数据库,后端是nodejs。发现ajax无响应,没有走进success的回调函数,也没有走进error的回调函数。
处理:首先检查功能有没有实现,发现后端其实是做了处理,数据库已经完成相关修改操作。那问题就很清楚了,后端处理完以后没有给前端响应。在后端处理完后加上相关响应代码即可解决,由此可知,ajax的错误状态码,其实都是后端发送过来的。
以上是个人开发过程中遇到的问题及处理总结,若有不正之处,望提出指正,万分感激!
以上就是本文的全部内容,希望对大家有所帮助,同时也希望多多支持云栖社区!}

我要回帖

更多关于 jquery ajax json 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信