【转】一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。
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.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace WebAPI.Common
{
public class JsonConverter: MediaTypeFormatter
{
private JsonSerializerSettings _jsonSerializerSettings;
private UTF8Encoding Encoding;
public JsonConverter(JsonSerializerSettings jsonSerializerSettings)
{
_jsonSerializerSettings = jsonSerializerSettings ?? new JsonSerializerSettings();
// Fill out the mediatype and encoding we support
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
Encoding = new UTF8Encoding(false, true);
}
public override bool CanReadType(Type type)
{
//if (type == typeof(IKeyValueModel))
//{
// return false;
//}
return true;
}
public override bool CanWriteType(Type type)
{
return true;
}
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
{
// Create a serializer
JsonSerializer serializer = JsonSerializer.Create(_jsonSerializerSettings);
// Create task reading the content
return Task.Factory.StartNew(() =>
{
using (StreamReader streamReader = new StreamReader(readStream, Encoding))
{
using (JsonTextReader jsonTextReader = new JsonTextReader(streamReader))
{
return serializer.Deserialize(jsonTextReader, type);
}
}
});
}
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
{
// Create a serializer
JsonSerializer serializer = JsonSerializer.Create(_jsonSerializerSettings);
// Create task writing the serialized content
return Task.Factory.StartNew(() =>
{
using (StreamWriter streamWriter = new StreamWriter(writeStream, Encoding))
{
using (JsonTextWriter jsonTextWriter = new JsonTextWriter(streamWriter))
{
serializer.Serialize(jsonTextWriter, value);
}
}
});
}
}
}
【转】一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。相关推荐
- 浅析Asp.net MVC 中Ajax的使用
在ASP.NET MVC beta中我们可以使用Ajax.BeginForm, Ajax.ActionLink来进行Ajax调用,同样我们也可以使用一些支持Ajax 框架如jQuery来简化对ajax ...
- ASP.Net MVC 在ajax接收controller返回值为Json数据
首先,再次回忆一下ajax的标准用法:(这张图写的比较详细了)(转) 页面部分ajax代码: $.ajax({ url: "/Home/Login?account=& ...
- java返回json ajax_Spring MVC 中 AJAX请求并返回JSON的示例
一.以modelandview的方式返回 先看下javascript代码: /** * 保存-同步(版本控制库) */ function savesynchronizedvchorse(obj) { ...
- spring cloud 调用接口间歇性返回http 500 - Internal Server Error的错误
查找了各种资料都没找到解决办法,token失效,网络问题,接口服务问题,基础服务问题,都考虑过,但是没能解决,偶尔发现服务器网络配置中存在一个virbr0虚拟网卡,问了下了网管,删除这个对服务并没有影 ...
- ajax离开页面方法,jQuery中ajax调用当前页面方法
$.ajax({ type: 'POST', url: 'AddressManager.aspx/GetProvince',//AddressManager.aspx当前页面 data: '{cach ...
- ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)
AJAX的好处就是不会堵塞页面,可以提高用户体验,可以减少数据传输尺寸,提高应用程序的性能.目前,AJAX技术可以说是已经成为WEB开发的标准技术. AJAX技术是纯客户端技术,任何客户端框架(如:M ...
- JQuery和Ajax在ASP.NET MVC中的基本应用
当我们在开发Web应用程序中使用JQuery和Ajax异步调用来实现很多功能时,不仅提高了程序的性能,而且给用户一个更好的交互式界面操作体验.接下来我们依旧用简单的实例来学习下它们的应用. 创建一个A ...
- Asp.net mvc中的Ajax处理
在Asp.net MVC中的使用Ajax, 可以使用通用的Jquery提供的ajax方法,也可以使用MVC中的AjaxHelper. 这篇文章不对具体如何使用做详细说明,只对于在使用Ajax中的一些需 ...
- asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染...
在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...
最新文章
- 牛客 Tree(最小深度总和)(两种方法求重心)难度⭐⭐⭐
- webservice 测试窗体只能用于来自本地计算机的请求
- python什么时候用框架_python时间模块的使用
- 微信小程序获取用户唯一openid,包含java
- [转]Multiple outputs from T4 made easy
- Android官方开发文档Training系列课程中文版:添加ActionBar之ActionBar浮层效果
- magicmatch java_Java-webmagic爬虫
- CentOS7与CentOS6区别及特点
- 栈溢出脚本_CTF必备技能丨Linux Pwn入门教程——栈溢出基础
- PSD网页切图制作HTML全过程教程
- 用c语言编程英雄联盟,用C语言编写购置英雄联盟中的物品的过程
- 金融衍生品软件产品设计必备知识——上海黄金交易所产品概览
- JAVA8 日期和时间(LocalDate、LocalDateTime、ZoneId、Duration、Period、Instant)API 用法详解
- mysql存不了表情_mysql保存不了微信表情符emoji问题解决方案
- 什么是聚类以及四种聚类方法的比较
- 佳能Canon PIXMA MG6320 一体机驱动
- 北京大学数据结构与算法视频下载
- docker虚拟化技术
- 欧姆龙CP1H+CIF11与海利普变频器modbus通讯
- PowerDesign 16.5.5.2 (4734) 汉化包
热门文章
- Python网络爬虫之图片懒加载技术、selenium和PhantomJS
- 20172329 2017-2018-2 《程序设计与数据结构》实验一报告
- 通过tomcat日志定位错误
- 【VS开发】static、extern分析总结
- UITableView:改变 TableHeaderView 的高度
- 顺丰快递,果然不一般!
- [SAP FI] Bank Master Vendor Master Creation Related Knowledge
- [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]
- python总结字典集合列表_python 列表,元组,字典,集合,字符串相互转换
- windows c语言 redis,windows上使用VS2012 C++语言调用Redis的解决方案