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属性代码并获得持久属性值。

结论:

  1. WebApi在返回JSON数据时的序列化操作产生的异常,是WebApi方法之外的异常,暂时不能被捕获(.NET Framework 4.0下笔者暂时没有找到捕获的方法),此时将返回500 Internal Server Error错误。
  2. JSON序列化对象时,将获取该对象的所有的get属性值(即运行get属性的代码)。
  3. 可以编程模拟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的调错方法。相关推荐

  1. 浅析Asp.net MVC 中Ajax的使用

    在ASP.NET MVC beta中我们可以使用Ajax.BeginForm, Ajax.ActionLink来进行Ajax调用,同样我们也可以使用一些支持Ajax 框架如jQuery来简化对ajax ...

  2. ASP.Net MVC 在ajax接收controller返回值为Json数据

    首先,再次回忆一下ajax的标准用法:(这张图写的比较详细了)(转) 页面部分ajax代码: $.ajax({             url: "/Home/Login?account=& ...

  3. java返回json ajax_Spring MVC 中 AJAX请求并返回JSON的示例

    一.以modelandview的方式返回 先看下javascript代码: /** * 保存-同步(版本控制库) */ function savesynchronizedvchorse(obj) { ...

  4. spring cloud 调用接口间歇性返回http 500 - Internal Server Error的错误

    查找了各种资料都没找到解决办法,token失效,网络问题,接口服务问题,基础服务问题,都考虑过,但是没能解决,偶尔发现服务器网络配置中存在一个virbr0虚拟网卡,问了下了网管,删除这个对服务并没有影 ...

  5. ajax离开页面方法,jQuery中ajax调用当前页面方法

    $.ajax({ type: 'POST', url: 'AddressManager.aspx/GetProvince',//AddressManager.aspx当前页面 data: '{cach ...

  6. ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)

    AJAX的好处就是不会堵塞页面,可以提高用户体验,可以减少数据传输尺寸,提高应用程序的性能.目前,AJAX技术可以说是已经成为WEB开发的标准技术. AJAX技术是纯客户端技术,任何客户端框架(如:M ...

  7. JQuery和Ajax在ASP.NET MVC中的基本应用

    当我们在开发Web应用程序中使用JQuery和Ajax异步调用来实现很多功能时,不仅提高了程序的性能,而且给用户一个更好的交互式界面操作体验.接下来我们依旧用简单的实例来学习下它们的应用. 创建一个A ...

  8. Asp.net mvc中的Ajax处理

    在Asp.net MVC中的使用Ajax, 可以使用通用的Jquery提供的ajax方法,也可以使用MVC中的AjaxHelper. 这篇文章不对具体如何使用做详细说明,只对于在使用Ajax中的一些需 ...

  9. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染...

    在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...

最新文章

  1. 牛客 Tree(最小深度总和)(两种方法求重心)难度⭐⭐⭐
  2. webservice 测试窗体只能用于来自本地计算机的请求
  3. python什么时候用框架_python时间模块的使用
  4. 微信小程序获取用户唯一openid,包含java
  5. [转]Multiple outputs from T4 made easy
  6. Android官方开发文档Training系列课程中文版:添加ActionBar之ActionBar浮层效果
  7. magicmatch java_Java-webmagic爬虫
  8. CentOS7与CentOS6区别及特点
  9. 栈溢出脚本_CTF必备技能丨Linux Pwn入门教程——栈溢出基础
  10. PSD网页切图制作HTML全过程教程
  11. 用c语言编程英雄联盟,用C语言编写购置英雄联盟中的物品的过程
  12. 金融衍生品软件产品设计必备知识——上海黄金交易所产品概览
  13. JAVA8 日期和时间(LocalDate、LocalDateTime、ZoneId、Duration、Period、Instant)API 用法详解
  14. mysql存不了表情_mysql保存不了微信表情符emoji问题解决方案
  15. 什么是聚类以及四种聚类方法的比较
  16. 佳能Canon PIXMA MG6320 一体机驱动
  17. 北京大学数据结构与算法视频下载
  18. docker虚拟化技术
  19. 欧姆龙CP1H+CIF11与海利普变频器modbus通讯
  20. PowerDesign 16.5.5.2 (4734) 汉化包

热门文章

  1. Python网络爬虫之图片懒加载技术、selenium和PhantomJS
  2. 20172329 2017-2018-2 《程序设计与数据结构》实验一报告
  3. 通过tomcat日志定位错误
  4. 【VS开发】static、extern分析总结
  5. UITableView:改变 TableHeaderView 的高度
  6. 顺丰快递,果然不一般!
  7. [SAP FI] Bank Master Vendor Master Creation Related Knowledge
  8. [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]
  9. python总结字典集合列表_python 列表,元组,字典,集合,字符串相互转换
  10. windows c语言 redis,windows上使用VS2012 C++语言调用Redis的解决方案