一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。
来源:互联网 发布:2017电视选购 知乎 编辑:程序博客网 时间:2024/06/06 18:03
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;using System.Net.Http.Formatting;using System.Threading.Tasks;using Newtonsoft.Json;using System.IO;using System.Net.Http;using System.Net;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) { return true; } public override bool CanReadType(Type type) { return true; } public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) { var task = Task<object>.Factory.StartNew(() => { try { string json; 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); // 保存异常信息 throw err; } }); return task; } public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext) { var task = Task.Factory.StartNew(() => { try { 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); // 保存异常信息 throw err; } }); return task; } }}还需要在全局配置文件中注册上述定制的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格式}
- 一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。
- http 500 Internal Server Error的错误 ajax请求SpringMVC后台中返回500 Internal Server Error
- 关于ASP.NET 中使用Ajax进行异步调用问题,前台参数无法跳转到后台,提示500 internal server error
- 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
- 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
- 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
- AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
- 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
- MVC中调用WEBAPI的方法
- 在IIS6中配置asp.net MVC网站时HTTP 错误 500.21 - Internal Server Error解决方案
- 在IIS6中配置asp.net MVC网站时HTTP 错误 500.21 - Internal Server Error解决方案
- ajax返回json格式 报500 Internal Server Error
- jquery ajax返回Internal server error 500错误怎么解决??
- asp.net mvc webapi 实用的接口加密方法
- 配置Asp.Net MVC WebAPI可跨域方法
- vs.net中创建asp.net程序时,出现:http/1.1 500 internal server error
- asp.net mvc 使用Ajax调用Action 返回数据。
- asp.net mvc 使用Ajax调用Action 返回数据。
- HRBUST1310-火影忍者之~鸣人
- 负载均衡服务的相关命令操作失败------又是磁盘满了惹的祸!
- PAT--1125. Chain the Ropes
- 详解并行逻辑回归
- Android中通过Gson进行json解析
- 一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。
- Deep Visual-Semantic Alignments for Generating Image Descriptions摘要
- 7. Reverse Integer
- 微信硬件平台开发--精品博客集
- 关于Asmack聊天框架源码粘贴到项目时报错的解决方法
- linux系统安装mysql数据库(需要在线安装)
- 简单工厂模式
- Codeforces #403 Div.2 B.The Meeting Place Cannot Be Changed
- QML,QT, QT Quick关系