900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 【转】一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。

【转】一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。

时间:2020-10-02 01:09:40

相关推荐

【转】一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。

MVC 引入的WebApi自然且较好地满足了ajax的交互需求,但使用jQuery ajax调用WebApi返回500 Internal Server Error时却不太好查找错误。在一个实际项目中,WebApi方法全部使用了try-catch捕获异常,并返回定制的错误消息,想当然认为有错误就能捕获。但最近网站运行时却总是有500错误,花了一番功夫才发现问题所在。

经过多次调试,确定这个错误应该是WebApi方法之外引发的(方法内部应该被try-catch捕获)。初步判断,是在 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 、 .NET 4.0和 MVC4上调试通过。

后记:

经过数天的网查调试,找到了一个通用的、捕获WebApi方法Json序列化产生异常的方法,基本思路:定制 MVC默认的Json序列化转换器JsonConverter(该类由Newtonsoft动态库提供),在读写序列化流时捕获异常。

重写的JsonConverter转换器类代码如下:

using System;

using System.IO;

using ;

using .Http;

using .Http.Formatting;

using .Http.Headers;

using System.Text;

using System.Threading.Tasks;

using Newtonsoft.Json;

namespace mon

{

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);

}

}

});

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。