来自 Javascript AJAX 的 ASP.NET MVC 操作调用收到 500 内部服务器错误

Posted

技术标签:

【中文标题】来自 Javascript AJAX 的 ASP.NET MVC 操作调用收到 500 内部服务器错误【英文标题】:ASP.NET MVC Action Call from Javascript AJAX Receives 500 Internal Server Error 【发布时间】:2019-09-29 06:10:12 【问题描述】:

使用 ajax 调用具有 IIS 7.5 网站的服务器中的控制器操作时收到“500 内部服务器错误”消息。进程在 localhost 开发环境中运行良好。

该过程涉及 Ajax 调用,该调用将 json 对象发送到控制器操作方法,然后控制器操作方法发回 json 消息。我已经尝试在 Routeconfig 文件中创建自定义路由以考虑 iis 站点名称。即,“http://localhost:3000/home”与“http://SiteName/defaultapplicationpage”。

JS 文件

        $.ajax(
            async: false,
            type: "POST",
            url: "/TimeEntryWeeklyReportsTest/Home/CheckIfRecordsExist",
            //url: "/Home/CheckIfRecordsExist",
            data: ' data:' + jsondata + '',
            contentType: "application/json; charset=utf-8",
            dataType: "json"
        ).done(function (response) 
            console.log(response);
            if (response === "true") 
                var param = "&StartDate=" + data.StartDate + "&EndDate=" + data.EndDate;
                param = Employeefilter !== undefined ? param + "&" + Employeefilter + "=" + data.EmployeeUserid : param + "&Employee=" + data.EmployeeUserid;
                $('#successmsg').html("Successful");
                window.location.href = url + param + "&rs:Format=" + documentType;
            
            else 
                $('#errmsg').html("No records found.");
                throw 'records not found error';
            
        ).fail(function (response) 
            console.log('Error: ' + response);
        );

CS 控制器

        [HttpPost]
        [Route("TimeEntryWeeklyReportsTest/Home/CheckIfRecordsExist")]
        public JsonResult CheckIfRecordsExist(FormData data)
        
            string strID = GetIDFromUser((!String.IsNullOrEmpty(GetUser())) ? GetUser() : Environment.UserName);
            var results = timeEntry.TimeEntryReport(data.EmployeeSupervisor == "Supervisor" ? null : data.EmployeeUserid, data.EmployeeSupervisor == "Employee" ? null : data.EmployeeUserid, Convert.ToDateTime(data.Startdate), Convert.ToDateTime(data.Enddate)).ToList<TimeEntryReport_Result>();
            if (results.Count != 0)
            
                return Json("true", JsonRequestBehavior.AllowGet);
            
            else
            
                return Json("false", JsonRequestBehavior.AllowGet);
            
        

路由配置

    public class RouteConfig
    
        public static void RegisterRoutes(RouteCollection routes)
        
            routes.IgnoreRoute("resource.axd/*pathInfo");

            routes.MapRoute(
                name: "CheckIfRecordsExist",
                url: "TimeEntryWeeklyReportsTest/controller/action",
                defaults: new  controller = "Home", action = "CheckIfRecordsExist" 
            );
            routes.MapRoute(
                name: "Default",
                url: "controller/action/id",
                defaults: new  controller = "Home", action = "Index", id = UrlParameter.Optional 
            );
        
    

预期的结果是让方法返回“true”或“false”语句。好像没有处理ajax调用,收到500内部错误。

【问题讨论】:

那个 500 错误的细节非常重要。从客户端的角度来看,500 的字面意思只是“服务器出了点问题”。这些细节通常不会交给客户,因为用户不需要知道。但是,如果您在服务器上进行调试,您可以看到实际的异常是什么,这将是修复它的第一步。如果在调试时找不到它,您也可以在事件查看器中找到它。 同意斯科特的建议。此外,如果您已经实现了错误处理,请尝试在那里放置一个喙点。另外,为了快速检查,在控制器中添加 try catch 块,仅用于测试。 另外,除上述之外,删除async: false。这是非常糟糕的做法,您不需要它,因为您已经实现了承诺回调。 【参考方案1】:

尝试像这样在您的控制器中服务 json 并在 javascript 中使用它

 public async Task<JsonResult> DonutChartData()
        
            int tagIn = (await db.Tag.Where(x => x.IsIn == true).ToListAsync()).Count;
            int cardIn = (await db.Entry.Where(c => c.Type == Type.Card).Where(x => x.IsExit == false).ToListAsync()).Count;
            int reservedIn = (await db.Cars.Where(c => c.Type == Type.Pin).Where(x => x.IsExit == false).ToListAsync()).Count;
            DonutChart _chart = new DonutChart();
            _chart.labels = new string[]  "x", "y", "x" ;
            _chart.datasets = new List<DonutChartDatasets>();
            List<DonutChartDatasets> _dataSet = new List<DonutChartDatasets>();
            _dataSet.Add(new DonutChartDatasets()
            
                label = "Whois",
                //TO-DO: Add Reserve to Report
                data = new int[]  cardIn, tagIn, reservedIn ,
                backgroundColor = new string[]  "rgba(54, 162, 235,0.5)", "rgba(255, 205, 86,0.5)", "rgba(255,99,132,0.5)" ,
                borderColor = new string[]  "rgb(54, 162, 235)", "rgb(255, 205, 86)", "rgb(255,99,132)" ,
                borderWidth = "1"
            );
            _chart.datasets = _dataSet;
            return Json(_chart, JsonRequestBehavior.AllowGet);
        

在您的视图中,脚本以这种方式使用数据:

 jQuery.extend(
            getValues: function (url) 
                var result = null;
                $.ajax(
                    url: url,
                    type: 'get',
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    async: false,
                    success: function (data) 
                        result = data;
                    
                );
                return result;
            
        );

【讨论】:

以上是关于来自 Javascript AJAX 的 ASP.NET MVC 操作调用收到 500 内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API 在来自 Chrome 扩展的并发 AJAX 调用上崩溃

ASP.NET / JavaScript - Ajax 调用,如何?

获取JavaScript和ASP.NET交谈(在AJAX之外)

JavaScript-Runoob-AJAX:ASP/PHP 实例

如何为 ASP.NET Ajax 重用来自 Telerik RadControls 的 css 样式

从 ajax 调用到 javascript 日期的 ASP.NET 解析 DateTime 结果