当Json Length过长时,对ASP.NET MVC Controller的Ajax调用返回404

Ajax call to ASP.NET MVC Controller Returns 404 when Json Length is too Long

本文关键字:Controller MVC Ajax 调用 返回 NET ASP Length Json      更新时间:2023-09-26

我有一个简单的ajax调用,它将一个json字符串传递给控制器操作,如果json的内容部分太长,或者通常是json字符串,服务器会返回一个404,如果我缩短了内容,请求就会正确解析并完成。

我以为它已经达到了微软JavaScriptSeralizer的8k限制,但我已经更新了MaxJsonLength,但运气不好。有人能告诉我这里发生了什么事吗?

这是我的ajax请求(注意:这是使用Knockout.js)

 self.updatePost = function () {
            var postToUpdate = ko.toJS(self.selectedPost);
            postToUpdate.Content = $("#wmd-input").val();
            console.log(postToUpdate);
            $.getJSON('/blogs/posts/update', {post: ko.toJSON(postToUpdate)}, function(post) {
                if (post) {
                    // remove the selected post and add the updated post
                    self.posts.remove(self.selectedPost());
                    var updatedPost = new Post(post);
                    self.posts.unshift(updatedPost);
                    self.selectedPost(updatedPost);
                    $("#ghost-list li:first").trigger('click');
                    // show alert
                }
            });
        };

C#控制器动作

 public JsonResult Update(string post)
    {
        var seralizer            = new JavaScriptSerializer();
        seralizer.MaxJsonLength  = int.MaxValue;
        seralizer.RecursionLimit = 100;
        var selectedPost         = seralizer.Deserialize<Post>(post);
        var student              = students.GetStudentByEmail(User.Identity.Name);
        var blog                 = db.Blogs.SingleOrDefault(b => b.StudentID == student.StudentID);
        var postToUpdate         = blog.BlogPosts.SingleOrDefault(p => p.ID == selectedPost.ID);
        if (postToUpdate != null)
        {
            // update the post fields
            postToUpdate.Title       = selectedPost.Title;
            postToUpdate.Slug        = BlogHelper.Slugify(selectedPost.Title);
            postToUpdate.Content     = selectedPost.Content;
            postToUpdate.Category    = selectedPost.Category;
            postToUpdate.Tags        = selectedPost.Tags;
            postToUpdate.LastUpdated = DateTime.Now;
            if (selectedPost.Published)
            {
                postToUpdate.DatePublished = DateTime.Now;
            }
            // save changes
            db.SaveChanges();
            var jsonResult = Json(seralizer.Serialize(selectedPost), JsonRequestBehavior.AllowGet);
            jsonResult.MaxJsonLength = int.MaxValue;
            return jsonResult;
        }
        return Json(false, JsonRequestBehavior.AllowGet);
    }

您是否尝试过使用post方法:

$.post('/blogs/posts/update', {post: ko.toJSON(postToUpdate)}, function(post) {
    if (post) {
        // remove the selected post and add the updated post
        self.posts.remove(self.selectedPost());
        var updatedPost = new Post(post);
        self.posts.unshift(updatedPost);
        self.selectedPost(updatedPost);
        $("#ghost-list li:first").trigger('click');
        // show alert
    }
 }, 'json');

在web配置中尝试

<system.web.extensions>
<scripting>
  <webServices>
    <jsonSerialization maxJsonLength="500000000"/>
  </webServices>
</scripting></system.web.extensions>