【问题标题】:500 Internal Server Error ajax post json500 内部服务器错误 ajax post json
【发布时间】:2014-01-28 07:54:21
【问题描述】:

我使用 ASP.NET MVC 和 Knockoutjs 构建了一个网站。这托管在 Windows Sever 2012 上的 IIS 上。还有另一个 Web 应用程序,我在其中使用 ajax 进行 POST 并且该应用程序没有给出任何错误。网站上的提交按钮是通过点击绑定到这个函数的。当我在本地主机上以调试模式运行它时,这有效。

self.SubmitEvaluation = function () {
    reqUrl = "/Home/SubmitEvaluation";
    $.ajax({
        type: "POST",
        url: reqUrl,
        data: JSON.stringify({ evaluation: ko.toJSON(self) }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            if (response == 1) {
                self.EvalComplete(true);
            } else {
                self.EvalComplete(false);
                alert("Submission Failed.  Please resubmit!!!")
            }
        },
        error: function (jqXHR, exception) {                
            if (jqXHR.status === 0) {
                alert('Not connect.\n Verify Network.');
            } else if (jqXHR.status == 404) {
                alert('Requested page not found. [404]');
            } else if (jqXHR.status == 500) {
                alert('Internal Server Error [500].'+exception.toString());
            } else if (exception === 'parsererror') {
                alert('Requested JSON parse failed.');
            } else if (exception === 'timeout') {
                alert('Time out error.');
            } else if (exception === 'abort') {
                alert('Ajax request aborted.');
            } else {
                alert('Uncaught Error.\n' + jqXHR.responseText);
            }
        }
    });

在家庭控制器中,我有这两种网络方法。

[HttpGet]
    public string Test()
    {
        Logger.Logger.WriteLog("Test", "Inside Test");
        TestModel product = new TestModel();
        product.Name = "Apple";
        product.Price = "3.99M";
        return JsonConvert.SerializeObject(product);
    }
    [HttpPost]
    public int SubmitEvaluation(string evaluation)
    {
        Logger.Logger.WriteLog("Submitevaluation", "Inside SubmitEvaluation");          
        int result = -1;
        try
        {
            EvaluationModel eval = JsonConvert.DeserializeObject<EvaluationModel>(evaluation);
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();

            string sql = "INSERT INTO xyz table blah blah blah";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            result = cmd.ExecuteNonQuery();
        }
        catch(Exception ex)
        {
            Logger.WriteLog("Submitevaluation", ex.ToString());
        }
        return result;
    }

单击“提交”按钮时,我收到来自 Ajax 请求的内部服务器错误 500。

但如果我这样做 http://xxx.xxx.xxx.xxx/Home/Test 我会返回 json 结果 {"Name":"Apple","Price":"3.99M"}。

来自 Fiddler 的响应标头

HTTP/1.1 500 内部服务器错误 缓存控制:私有 内容类型:文本/html;字符集=utf-8 服务器:Microsoft-IIS/8.0 X-AspNetMvc-版本:4.0 X-AspNet-版本:4.0.30319 X-Powered-By: ASP.NET 日期:格林威治标准时间 2014 年 1 月 9 日星期四 16:22:16 内容长度:276

打开客户错误和详细错误消息后,我收到了此消息。

Could not load file or assembly 'MySql.Data, Version=6.8.3.0, Culture=neutral,    PublicKeyToken=c5687fc88969c44d' or one of its dependencies. The system cannot find the file specified

我从http://dev.mysql.com/downloads/connector/net/ 下载了 Mysql 连接器,并通过右键单击 References > Extensions 并选择 4.0 版本来添加程序集。我也试过4.5。

【问题讨论】:

  • 在 JSON.Stringyfy() 之外保持“评估”并检查
  • data: JSON.stringify({ evaluation: ko.toJSON(self) }), - 您正在对 JSON 进行双重编码。你确定你想要那个吗?使用data: { evaluation: ko.toJS(self) }。您根本不需要进行任何 JSON 编码,jQuery 会为您完成。
  • 查看this question 以发现潜在错误。
  • CodeCaster 谢谢。
  • Tomalak,我更改了您的建议,但出现错误。

标签: asp.net ajax json iis knockout.js


【解决方案1】:

卸载 6.8 并下载 6.7。现在可以使用了。

【讨论】: