- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有时,我们会在实时环境中的 ASP.NET Web API 服务模块中观察到此错误,并且在应用程序池回收后问题得到解决。发送响应时发生此错误,一旦错误开始发生,所有后续请求都会因相同的错误而失败。不过,我们无法在较低的环境中重现此错误。即使使用简单的 GET 方法也会发生错误。
"stacktrace": " at Sy stem.Net.Http.Formatting.BaseJsonMediaTypeFormatter.CreateJsonSerializerInternal()\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext()", "exception_class": "System.InvalidOperationException",
"exception_message": "The 'CreateJsonSerializer' method threw an exception when attempting to create a JSON serializer.
”
如果有人遇到过此错误,请分享您的想法。
最佳答案
我们最近遇到了一个问题,其症状与所描述的相同。
我们案例中的问题是由于在 Web API Controller 代码中添加自定义 Json.Net 转换器的方式。
以下插入自定义转换器的方法是通过 Controller 构造函数完成的,
public FruitController() {
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new AppleConverter());
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new PearConverter());
}
这意味着对于每个新的 HTTP 请求上下文,转换器都被重新添加到静态转换器列表中。这会导致两个问题,
第二个问题是导致我们的案例出现问题的原因。
多个线程试图添加到相同的静态 .NET 列表(即非线程安全)实现,这导致列表中出现空条目。列表中的空转换器条目导致 Json.Net 抛出异常,导致与发布的堆栈跟踪中显示的异常类似的异常。由于转换器列表中保留空条目,此时间之后的所有其他 HTTP 请求都无法进行 JSON 序列化。
除了发布的堆栈跟踪,我们还观察到另一个堆栈跟踪,如
at Newtonsoft.Json.JsonSerializer.GetMatchingConverter(IList`1 converters, Type objectType) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonSerializer.cs:line 1121 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.GetConverter(JsonContract contract, JsonConverter memberConverter, JsonContainerContract containerContract, JsonProperty containerProperty) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 396 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 147
为了解决这个问题,我们删除了在 Web API Controller 构造函数中添加 JSON 转换器的代码,而是在应用程序启动线程中添加转换器。
例如,在 Global.asax 中,
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
/// ...
var converters = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters;
converters.Add(new FruitConverter());
converters.Add(new PearConverter());
}
}
关于c# - 网络 API : The 'CreateJsonSerializer' method threw an exception when attempting to create a JSON serializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46890368/
我是一名优秀的程序员,十分优秀!