gpt4 book ai didi

c# - 网络 API : The 'CreateJsonSerializer' method threw an exception when attempting to create a JSON serializer

转载 作者:太空狗 更新时间:2023-10-30 01:30:10 26 4
gpt4 key购买 nike

有时,我们会在实时环境中的 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.

如果有人遇到过此错误,请分享您的想法。

最佳答案

问题

我们最近遇到了一个问题,其症状与所描述的相同。

  • 在 .NET Framework 4.6.1 上使用 IIS 和 ASP.Net Web API 的网站。
  • Web API 请求在一段时间内运行良好,直到 JSON 序列化开始失败导致参数绑定(bind)错误,如所描述的那样。
  • 回收应用程序池或重新启动网站可解决问题。

我们案例中的问题是由于在 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 请求上下文,转换器都被重新添加到静态转换器列表中。这会导致两个问题,

  1. 随着 HTTP 请求的发出,转换器列表会随着时间的推移而增长,从而导致内存泄漏。
  2. 多个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com