【发布时间】:2020-08-28 18:48:58
【问题描述】:
我在将一些数据从控制器返回到视图时遇到问题,这是一个非常基本的 Dictionary
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model)
{
if(ModelState.IsValid)
{
try
{
var userExists = db.UserAuth.Where(ua => ua.Email == model.Email).Count() > 0;
if (userExists)
{
var uAuth = db.UserAuth.Where(ua => ua.Email == model.Email).ToList();
if (uAuth[0].Senha == model.Senha)
{
if (Request.Cookies.Get("CookieLogged") == null)
{
var CookieLogged = new HttpCookie("CookieLogged");
CookieLogged.Value = "true";
CookieLogged.Expires = DateTime.Now.AddHours(4);
CookieLogged.SameSite = SameSiteMode.Strict;
Response.Cookies.Add(CookieLogged);
}
else
{
var Logged = Request.Cookies.Get("CookieLogged");
Logged.Value = "true";
Logged.Expires = DateTime.Now.AddHours(4);
Response.Cookies.Set(Logged);
}
var JsonRedirect = new Dictionary<string, string>();
JsonRedirect.Add("redirect", Url.Action("Index", "Home"));
return Json(JsonRedirect);
}
else
{
var JsonWarning = new Dictionary<string, string>();
JsonWarning.Add("warning", "Senha não confere");
string jsonString = JsonConvert.SerializeObject(JsonWarning);
return Content(jsonString, "application/json");
}
}
else
{
var JsonWarning = new Dictionary<string, string>();
JsonWarning.Add("warning", "Email não confere ou usuário não existe");
return Json(JsonWarning, JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
var JsonError = new Dictionary<string, Exception>();
JsonError.Add("errorEx", ex);
return Json(JsonError, JsonRequestBehavior.AllowGet);
}
}
else
{
IDictionary<string, string> JsonWarning = new Dictionary<string, string>();
JsonWarning.Add("warning", "Dados inválidos");
return Content(JsonConvert.SerializeObject(JsonWarning), "application/json");
}
}
它在本地工作得很好,但一旦我将它发布到托管站点就会中断。请求返回 500 并且错误消息显示 System.InvalidOperationException: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'. ,堆栈跟踪表明问题可能出在字典被序列化的方式上,但这只是一个猜测。错误的堆栈跟踪:
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +1446 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +480 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+1324 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat)+127 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+1279 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +480 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+1324 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +480 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+1324 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +480 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+1324 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +480 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+1324 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +480 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+1324 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.SerializeDictionary(IDictionary o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +505 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +1218 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse,SerializationFormat serializationFormat,MemberInfo currentMember)+195 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(对象 obj,StringBuilder 输出,SerializationFormat 序列化格式)+29 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, SerializationFormat serializationFormat) +64 System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext 上下文)+347 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList
1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +56 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList1 过滤器,Int32 filterIndex,ResultExecutingContext preContext,ControllerContext controllerContext,ActionResult actionResult)+420 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList1 filters, ActionResult actionResult) +52 System.Web.Mvc.Async.<>c__DisplayClass3_6.<BeginInvokeAction>b__4() +198 System.Web.Mvc.Async.<>c__DisplayClass3_1.<BeginInvokeAction>b__1(IAsyncResult asyncResult) +100 System.Web.Mvc.Async.WrappedAsyncResult1.CallEndDelegate(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.<>c.<BeginExecuteCore>b__152_1(IAsyncResult asyncResult, ExecuteCoreState innerState) +11 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +29 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +45 System.Web.Mvc.<>c.<BeginExecute>b__151_2(IAsyncResult asyncResult, Controller controller) +13 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +22 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.<>c.<BeginProcessRequest>b__20_1(IAsyncResult asyncResult, ProcessRequestState innerState) +28 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +29 System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +577 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep 步骤) +132 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +163
那么,有没有办法防止序列化器进入这个循环呢?我之前也尝试过序列化并使用return Content() 发送到视图,但结果是一样的。我对该主题的研究显示了 EF 类和 DataTables 的这个问题,所以我真的不明白为什么我的简单字典没有通过。提前致谢。
【问题讨论】:
-
1) 您使用的是哪个版本的asp.net-mvc?
JavaScriptSerializer已经很老了。 2)你在上面的代码中经过哪个代码路径?有几个if声明,所以不清楚到底发生了什么。你能把edit 的代码写成minimal reproducible example 吗? -
你知道,如果你试图序列化一个
Exception,你可能会得到你所看到的回溯,因为Exception内部包含一个字典。事实上,您确实会在一个代码路径上返回Dictionary<string, Exception>();。这可能是导致问题的路径吗?为什么要返回异常字典? -
1)
System.Web.Mvc的程序集在 5.2.7.0 版本中。 2)所有路径通常都会给我这个问题,但它在后台进程中没有崩溃以产生异常。现在,当一切正常并且控制器返回重定向 url,以及密码不匹配时,它正在崩溃
标签: c# asp.net-mvc serialization