Razor页面加载异常无报错,部分生产实例故障排查求助
问题描述
我有一个包含多个AJAX函数用于获取和更新数据的Razor页面,该页面在本地环境及部分生产实例中运行正常,但在少数生产实例中,Chrome控制台提示500错误。我已添加全量日志,但未发现应用本身的错误(若应用存在问题,理应所有实例都故障)。
通过日志发现异常实例存在诡异行为:正常实例仅调用一次OnGet方法,后续均调用OnPostIndexPartial;而故障实例会调用两次OnGet方法,之后便无任何响应。我已添加逻辑确保OnGet仅调用一次,日志显示调用次数变为一次,但页面仍无法加载(连OnGet都未正常执行)。
我已耗费数小时排查仍毫无头绪,不清楚为何初始页面都无法渲染,导致后续的OnPostIndexPartial也无法执行。若有人遇到过类似情况,能提供排查思路或建议,我将万分感谢。
编辑补充
处理请求的PageModel代码(已移除部分代码)
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.Extensions.Logging; using System.Collections.Generic; using DTEmbarcado.Controllers; using System.Linq; using System; using System.Text; using System.Collections; using System.Text.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using DTEmbarcado.DTOS; using System.IO; using System.Threading; using static System.Net.Mime.MediaTypeNames; namespace DTEmbarcado.Pages { public class IndexModel : PageModel { public bool initialPetitionDone = false; public IndexModel() { } public JsonResult OnPostHeartbeatPartial(string name) { GlobalConstants.logger.insertaLog("OnPostHeartbeatPartial", DTLogger.INFO); Object json = null; try { if (!string.IsNullOrEmpty(name)) { json = System.Text.Json.JsonSerializer.Serialize("OK"); } } catch (Exception ex) { GlobalConstants.logger.insertaLog($"OnPostHeartbeatPartial ERROR: {ex.Message} : {ex.StackTrace} : {ex.InnerException}", DTLogger.ERROR); } return new JsonResult(json); } public void OnGet() { GlobalConstants.logger.insertaLog("GET Index", DTLogger.INFO); try { if (!initialPetitionDone) { initialPetitionDone = true; //SOME CODE } } catch (Exception ex) { GlobalConstants.logger.insertaLog($"GET Index ERROR: {ex.Message} : {ex.StackTrace} : {ex.InnerException}", DTLogger.ERROR); } } public JsonResult OnPostIndexPartial(string visualizationOptions, string searchPorts, string searchVars) { GlobalConstants.logger.insertaLog("ON POST INDEX PARTIAL", DTLogger.INFO); var json = ""; try { //SOME CODE this.Data = result; json = System.Text.Json.JsonSerializer.Serialize(this.Data); } catch (Exception ex) { GlobalConstants.logger.insertaLog($"OnPostIndexPartial ERROR: {ex.Message} : {ex.StackTrace} : {ex.InnerException}", DTLogger.ERROR); } return new JsonResult(json); } } }
CSHTML页面中的JavaScript代码
@page @addTagHelper*, Microsoft.AspNetCore.Mvc.TagHelpers @model DTEmbarcado.Pages.IndexModel @{ ViewData["Title"] = "Title"; } <div id="body" class="col-12 border text-left p-3 mt-3 d-flex"> <table id="valuesTable" class="table table-striped"> <thead> </thead> <tbody> @try { @if (Model.Data != null) { //Some code } } catch (Exception ex) { GlobalConstants.logger.insertaLog($"Ha ocurrido un error cargando Model.Data: {ex.Message} {ex.InnerException} {ex.StackTrace}",DTLogger.ERROR); } </tbody> </table> </div> @section scripts{ @*GLOBALS*@ <script> var sendRequest = true; var sendHeartbeat = false; function pop(div) { document.getElementById(div).style.display = 'block'; } function hide(div) { document.getElementById(div).style.display = 'none'; } </script> @*HEARTBEAT*@ <script> var refreshTime = 2000; const currentUrl = window.location.href; $(function () { setInterval(setHeartbeat, refreshTime); setHeartbeat(); }); function setHeartbeat(){ if (sendHeartbeat){ pop('popDiv'); var xhr = $.ajax({ type: "POST", timeout: 1000, beforeSend: function (xhr) { xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val()); }, url: '/?handler=HeartbeatPartial', data: { name: name }, dataType: 'json', headers: { 'Content-encoding': 'gzip' }, success: function (data) { hide('popDiv'); sendHeartbeat = false; sendRequest = true; }, error: function (xmlhttprequest, textstatus, message) { if (textstatus === "timeout") { xhr.abort(); } pop('popDiv'); sendRequest = false; sendHeartbeat = true; } }) } } //# sourceURL=heartbeatSource </script> @* REFRESH SCRIPT *@ <script type="text/javascript"> var refreshTime = 1000; var VOArray = []; $(function () { setInterval(loadTable, refreshTime); loadTable(); }); function loadTable() { //TIMEOUT var isDataReceived = false; //SOME CODE //FLAG SETTING if(sendRequest){ hide('popDiv'); //AJAX CALL var xhr = $.ajax({ type: "POST", timeout: 3000, beforeSend: function (xhr) { //console.log("Sending POST request"); xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val()); }, url: '/?handler=IndexPartial', data: { visualizationOptions: visualizationOptions, searchPorts: searchPorts, searchVars: searchVars }, dataType: 'json', headers:{ 'Content-encoding':'gzip' }, success: function (data) { keys = [] isDataReceived = true; var jsonObject = JSON.parse(data); if(Object.keys(jsonObject).length === 0){ $("#valuesTable tbody tr").remove(); }else{ $.each(jsonObject, function(index, variable){ keys.push(variable.name) if(document.getElementById(variable.name)){ document.getElementById(variable.name+"Value").innerText = variable.value; document.getElementById(variable.name+"LastUpdate").innerText = variable.lastUpdate; } else{ addRow(variable) } }) } $('#valuesTable tr').each(function (index, tr) { var name = tr.id if (name !== "") { if (!keys.includes(name)) { document.getElementById(tr.id).remove(); } } }) }, error: function(xmlhttprequest, textstatus, message) { if(textstatus==="timeout") { xhr.abort(); } else if (textstatus === "error"){ pop('popDiv'); sendRequest = false; sendHeartbeat = true; } } }) } } //# sourceURL=ChromeConsoleDebug </script> } @Html.AntiForgeryToken()
内容的提问来源于stack exchange,提问作者Aaron Parrilla
相关产品推荐
相关产品推荐

