开封网站建设-中企动力,wordpress浮动按钮插件,营销策略分析包括哪些内容,网站建设功能点价格ASP.NET MVC 引入的WebApi自然且较好地满足了ajax的交互需求#xff0c;但使用jQuery ajax调用WebApi返回500 Internal Server Error时却不太好查找错误。在一个实际项目中#xff0c;WebApi方法全部使用了try-catch捕获异常#xff0c;并返回定制的错误消息#xff0c;想当… 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 Taskobject 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); } } }); } } }