【发布时间】:2014-01-14 14:30:14
【问题描述】:
我有一个 MVC5 前端和一个 WebAPI 版本 2 后端。当我在前端编辑记录时,我更改了表单字段并单击“保存”,我立即收到错误:
此错误仅在我编辑记录时发生。创建全新记录时效果很好。
这是我的堆栈跟踪:
[SerializationException: Type 'AppTools.HelperClasses.LoggerHelper' in Assembly 'AppTools, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.]
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +10494323
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +230
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +121
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +178
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +51
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +540
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +131
System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1666
[HttpException (0x80004005): Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.]
System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1754
System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object value, BinaryWriter writer) +34
System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter writer) +628
System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData item, Stream stream) +240
System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item, Int32 initialStreamSize, Byte[]& buf, Int32& length, Boolean compressionEnabled) +62
System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) +111
System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +798
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
这是我的 WebAPI PUT 方法:
[HttpPut]
public HttpResponseMessage Put(int id, BulletinBoard bulletinBoard)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
db.Entry(bulletinBoard).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
这是我的前端(MVC5)编辑操作方法:
[HttpPost]
public ActionResult Edit(int id, BulletinBoard bulletinBoard)
{
bulletinBoard.ModifiedDate = DateTime.Now;
bulletinBoard.ModifiedBy = HttpContext.User.Identity.Name;
response = client.PutAsJsonAsync(string.Format("api/bulletinboard/put/{0}", id), bulletinBoard).Result;
//var test = response.Content.ReadAsStringAsync();
//HttpContext.Response.Write(test);
if (response.IsSuccessStatusCode)
{
return RedirectToAction("Index");
}
else
{
LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
"Cannot create a new message due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
return View("Problem");
}
}
请帮助我了解为什么会出现此错误!
【问题讨论】:
-
id 来自哪里?我的意思是来自 Url 或其部分发布请求
-
@VolodymyrBilyachat ID 来自 URL 的一部分。
-
顺便说一句,您有 [SerializationException: Type 'AppTools.HelperClasses.LoggerHelper' in Assembly 'AppTools, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 没有标记为可序列化。] 其中 LoggerHelper用过吗?
-
看起来你有行动或其他类似的东西
-
@VolodymyrBilyachat LoggerHelper 只是将异常插入到错误数据库中。我以前从未将 LoggerHelper 标记为可序列化。它捕获并处理/插入所有其他错误/异常而不会出错......只有当我编辑记录时才会发生此问题。
标签: c# asp.net-mvc serialization asp.net-web-api put