【问题标题】:How to configure JsonResult serializer如何配置 JsonResult 序列化器
【发布时间】: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(IList1 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.&lt;&gt;c__DisplayClass3_6.&lt;BeginInvokeAction&gt;b__4() +198 System.Web.Mvc.Async.&lt;&gt;c__DisplayClass3_1.&lt;BeginInvokeAction&gt;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.&lt;&gt;c.&lt;BeginExecuteCore&gt;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.&lt;&gt;c.&lt;BeginExecute&gt;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.&lt;&gt;c.&lt;BeginProcessRequest&gt;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-mvcJavaScriptSerializer 已经很老了。 2)你在上面的代码中经过哪个代码路径?有几个if 声明,所以不清楚到底发生了什么。你能把edit 的代码写成minimal reproducible example 吗?
  • 你知道,如果你试图序列化一个Exception,你可能会得到你所看到的回溯,因为Exception 内部包含一个字典。事实上,您确实会在一个代码路径上返回 Dictionary&lt;string, Exception&gt;();。这可能是导致问题的路径吗?为什么要返回异常字典?
  • 1) System.Web.Mvc 的程序集在 5.2.7.0 版本中。 2)所有路径通常都会给我这个问题,但它在后台进程中没有崩溃以产生异常。现在,当一切正常并且控制器返回重定向 url,以及密码不匹配时,它正在崩溃

标签: c# asp.net-mvc serialization


【解决方案1】:

我不确定你为什么要使用字典,但你可以试试这个:

return Json(new { redirect = Url.Action("Index", "Home") });

【讨论】:

  • 我正在使用字典来处理页面中的一些 JS/jQuery。这是确保用户知道发生了什么的非常基本的信息,所以我认为开设一个课程以便我可以解析它是不值得的。我也尝试了那个较短的版本,但它给了我同样的错误。我猜这与return Json() 尝试序列化的方式有关。话又说回来,它在本地机器上工作得很好......
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2020-08-19
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多