【发布时间】:2017-09-27 12:10:51
【问题描述】:
我有一个 Azure Web 应用程序 .NET(4.6.1)/c#/MVC5/EF/Newtonsoft.JSON(6.0.4) 可以正常运行一周,然后出乎意料地运行到 500错误,并变得对每个人都无法使用。重新启动和/或回收站点使站点恢复生机。我正在努力寻找根本原因。我已经看到一些线程表明应用程序池的不及时回收可能会导致这种行为。但是,在 IIS 中,站点被配置为从不回收(空闲超时 = 0,并且回收计划设置为 0)。有没有人遇到过这种情况或有什么建议?
以下是错误的措辞:
{"Message":"发生错误。","ExceptionMessage":"'ObjectContent`1' 类型未能序列化内容类型 'application/json; charset=utf-8' 的响应正文。" ,"ExceptionType":"System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"发生错误。","ExceptionMessage":"从 'Weaver 上的 'IsCompleted' 获取值时出错。 TruckScaleMgmt.Common.Models.TruckLoad'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":" 在 Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(对象目标)\r\n 在 Newtonsoft.Json .Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer,Object value,JsonContainerContract contract,JsonProperty member,JsonProperty property,JsonContract& memberContract,Object& memberValue)\r\n 在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer,Object value,JsonObjectContract合同,JsonProperty 成员,JsonContainerContrac t collectionContract, JsonProperty containerProperty)\r\n 在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n 在 Newtonsoft.Json.Serialization。 JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter。 WriteToStream(类型类型,对象值,流 writeStream,编码有效编码)\r\n 在 System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(类型类型,对象值,流 writeStream,编码有效编码)\r\n 在系统。 Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(类型类型,对象值,流 writeStream,HttpContent 内容)\r\n 在 System.Net.Http.Formatting.Bas eJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancelToken)\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System. Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext()" ,"InnerException":{"Message":"发生错误。","ExceptionMessage":"对象引用未设置为对象的实例。","ExceptionType":"System.NullReferenceException","StackTrace": " 在 Weaver.TruckScaleMgmt.Common.Models.TruckLoad.c.b__71_0(TruckLoadQuality t) 在 C:\Users\wh741\Source\Repos\Scalehouse\Weaver.TruckScaleMgmt.Common\Models\TruckLoad.cs:line 223\ r\n 在 System.Linq.Enumerable.WhereListIterator`1.MoveNext()\r\n 在 System.Collections.Generic.List`1..ctor(IEnum erable`1 集合)\r\n 在 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源)\r\n 在 C:\Users\ 中的 Weaver.TruckScaleMgmt.Common.Models.TruckLoad.UpdateCompletedRequirements() wh741\Source\Repos\Scalehouse\Weaver.TruckScaleMgmt.Common\Models\TruckLoad.cs:line 223\r\n at Weaver.TruckScaleMgmt.Common.Models.TruckLoad.get_IsCompleted() in C:\Users\wh741\Source\ Repos\Scalehouse\Weaver.TruckScaleMgmt.Common\Models\TruckLoad.cs:335 行\r\n 在 GetIsCompleted(Object )\r\n 在 Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)"}}}
。 . .
更新:
我已经能够重现该问题,并认为这是布尔变量序列化的问题。我还没有修复它,但我相信我知道根本原因。我之前发布的代码与根本原因无关......
更新2:
好的。我已经解决了这个问题。一次在蓝月亮中发生的案例在 linq 查询中的字段中留下了一个空值。但是,我不知道为什么这会使该应用程序对所有人都无法使用。一个实例使该应用程序适合所有人.....
【问题讨论】:
-
那么
IsCompleted和UpdateCompletedRequirements()会发生什么?你在那里有一个 NRE。 -
它在下面的 quality.where 语句中失败。然而,我认为这是一个症状。它在 99% 的时间里都能正常工作。
-
您期望控制器方法的输出类型是什么?似乎输出没有序列化为 json。那是错误
-
那么下一个问题是:
Quality是什么?您从哪里确切地获得 NRE?显然您希望QualityField始终不为空?请尽量预测明显的问题,否则这将是漫长的一天。 -
对不起.....新手。我添加了定义和人口。 QualityField 不应为空。
标签: c# .net entity-framework azure azure-web-app-service