【问题标题】:Internal server error ajax submission内部服务器错误 ajax 提交
【发布时间】:2018-05-23 01:05:25
【问题描述】:

我有一个在按钮单击时触发的函数,它传递以下参数:insertSongPlay(newSong.songID); 当我 console.log newSong.songID 我看到一个值 90,这是所需的。

这里调用这个函数,它运行一个 ajax 调用:

function insertSongPlay(songID)

{
    $.ajax
    ({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: "/Album/InsertSongPlay/",
        data: JSON.stringify({ "songID": songID }),
        success: function(data)
        {

            console.log("submitted");
            console.log(songID);
            //TODO: Indicate Success
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            //TODO: Indicate Error
            console.log(errorThrown);
        }
    });
}

这是在我的 AlbumController 中找到的相应 ajax url:

public JsonResult InsertSongPlay(int songID)
{
    try
    {
        EntityDataAccess.InsertSongPlay(songID);
        return Json(true);
    }
    catch(Exception ex)
    {
        return Json(ex);
    }
}

然后在我的EntityDataAccess.cs下面是从InsertSongPlay实体数据访问中运行的:

public static SongPlayDaily InsertSongPlay(int songID)
{
    using(var Context = GetContext())
    {
        var currentSongPlay = Context.SongPlayDailies.FirstOrDefault(x => x.SongID == songID && x.PlayDate == DateTime.Now.Date);
        if (currentSongPlay != null)
            currentSongPlay.NumberOfPlays++;
        else
        {
            currentSongPlay = new SongPlayDaily();
            currentSongPlay.SongID = songID;
            currentSongPlay.PlayDate = DateTime.Now.Date;
            currentSongPlay.NumberOfPlays = 1;
            Context.SongPlayDailies.Add(currentSongPlay);
        }
        Context.SaveChanges();
        return currentSongPlay;
    }
}

但是,我的 ajax 调用总是会引发错误并将Internal Server Error 打印到控制台日志中。 Visual Studio 调试模式指示某种循环引用错误。我不太确定我哪里出错了。

谢谢!

【问题讨论】:

  • 错误信息到底是什么?
  • @epascarello 我的 ajax 响应返回一个错误参数:Internal Server Error但在调试模式下我看到更多信息:A circular reference was detcted while serializing an object of type System.Reflection.RuntimeModule`
  • 删除return Json(ex) - 我猜这就是导致循环引用错误的原因。然后看看抛出了什么真正的错误。
  • 使用throw 而不是使用Json来查看实际错误
  • @Niladri 没有。使用throw,或直接删除try/catch

标签: javascript c# jquery asp.net ajax


【解决方案1】:

正如我们在 cmets 中发现的那样 - 这里存在多个问题。首先,

return Json(ex);

是个坏主意。这将检查异常的所有属性并尝试将它们以及这些属性的所有属性序列化为 json。如您所见,这并不顺利,而且完全没有必要。如果你想向客户端返回错误响应 - 准备它(例如使用ex.Message)。另外,您不希望在每次错误时都向您的客户端返回有意义的信息(如堆栈跟踪)。

除此之外 - 通过在异常上执行 return Json() - 您违反了 HTTP 约定。 Json() 将返回状态码为 200 OK 的响应。但在你的情况下,它并不是真的“好的”——所以你应该返回另一个指示错误的状态代码。如果不是那个循环引用错误 - 你的 ajax“错误”处理程序中的代码永远不会被触发,即使真的有错误。

修复它的最简单方法是完全删除 try-catch 并让框架为您处理。

第二个问题是

x.PlayDate == DateTime.Now.Date

在查询中过滤。实体框架在访问 DateTime 对象的 Date 属性时遇到问题,并拒绝将其转换为 SQL 查询。您可以将其移至另一个变量:

var today = DateTime.Now.Date;
Where(x => x.PlayDate == today)

或使用DbFunctions.TruncateTime:

Where(x => x.PlayDate == DbFunctions.TruncateTime(DateTime.Now))

请注意,这些方式并不完全相同。首先将与确切的日期值进行比较,其次将使用 SQL SYSDATETIME() 函数。不过在这种情况下,这并不重要。

【讨论】:

    【解决方案2】:

    是因为您在控制器操作中缺少 [HttpPost] 属性吗?

    [HttpPost]
    public JsonResult InsertSongPlay(int songID)
    { 
        try
        {
            EntityDataAccess.InsertSongPlay(songID);
            return Json(true);
        }
        catch(Exception ex)
        {
            return Json(ex);
        }   
    }
    

    【讨论】:

    • 不幸的是我不这么认为,我没有改变就添加了它
    • 这很可能是因为 SongPlayDaily 引用了它的父级 (SongPlayDaily) - 您可以使该字段不可序列化以解决问题。
    【解决方案3】:

    在后期操作中,您应该使用复杂类型来接收来自客户端的数据。

    试试这个

    [HttpPost]
    public JsonResult InsertSongPlay(SongModel songModel)
    { 
        try
        {
            EntityDataAccess.InsertSongPlay(songModel.songID);
            return Json(true);
        }
        catch(Exception ex)
        {
            return Json(ex);
        }   
    }
    
    public class SongModel{
        public int songID {get;set}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2020-02-12
      • 2016-01-12
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多