【问题标题】:Editing (PUT) a record in MVC5/WebAPI2 results in error "Unable to serialize the session state."在 MVC5/WebAPI2 中编辑 (PUT) 记录会导致错误“无法序列化会话状态”。
【发布时间】: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


【解决方案1】:

可能的问题是你的模型试图在没有 id 的情况下进行更新,因为你有签名

 public HttpResponseMessage Put(int id, BulletinBoard bulletinBoard)

这意味着公告板可能没有设置的 ID,然后你有

 if (!ModelState.IsValid)
 {
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
 }

那么您的模型可能无效并且响应应该返回状态 Status Code:400 Bad Request,但是由于您有一些无法序列化的日志异常,所以它会抛出异常

解决它试试

public HttpResponseMessage Put(int id, BulletinBoard bulletinBoard) {
bulletinBoard.Id = id;

【讨论】:

  • 不,没有这样做。我会再次尝试使用 Fiddler。
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 2013-09-24
  • 2021-07-18
  • 2010-11-23
相关资源
最近更新 更多