我有一个简单的 ASP.NET Core 5 Razor Pages 应用程序,它不显示任何开发人员异常页面,但在浏览器开发人员工具中显示以下消息:
未声明纯文本文档的字符编码。如果文档包含 US-ASCII 范围之外的字符,则在某些浏览器配置中,该文档将呈现为乱码。文件的字符编码需要在传输协议中声明或者文件需要使用字节顺序标记作为编码签名。
经过多次迭代和调试,结果发现 SQL 查询中存在一个简单的拼写错误,它没有显示开发人员错误页面,而是在浏览器控制台中显示空白页面/结果,并带有上述错误!
有没有办法打开“更多”调试来识别此类错误,而不是反复试验?
环境:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logg)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseDeveloperExceptionPage();
//app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
...
没有 try/catch 处理程序,代码相当基本。在剃须刀页面:
public IEnumerable<gEmployee> ListRows { get; private set; }
DAL mDAL;
public string Message;
public void OnGet(int dID)
{
ListRows = mDAL.GetEmployees(dID);
Message = $"Got {ListRows.Count()} Rows";
}
这就是我在调用
OnGet()
时发现错误的方法,但带有 Message = ListRows.Count
的第二行不会被执行。
在获取员工
public List<gEmployee> GetEmployees(int dID)
{
using (var conn = new SqlConnection(cx.DefaultConnection))
{
var sql = @"SELECT * from gEmployee ";
if (dID > 0)
sql += " WHERE dID = @dID ";
var ListRows = conn.Query<gEmployee>(sql, new { dID = dID}).ToList();
return ListRows;
}
}
通常在这些情况下,第一种方法应该是尝试在小型/干净的项目上重现行为,以便您可以排除各种情况。
如您所见,就您而言,这就是
services.AddDatabaseDeveloperPageExceptionFilter()
这就是导致问题的原因。 正如微软在文档中所说
这只能在开发环境中启用。
如果服务器端代码出现异常,将显示开发人员错误页面。根据控制台消息,您的 SQL 拼写错误可能不会导致引发异常。或者,如果确实如此,您可能会将其隐藏在
try - catch
块中。您实际上尚未显示相关代码,因此这纯粹是猜测。无论哪种方式,它都会导致您的视图页面尝试呈现浏览器无法理解的内容,因此浏览器会在控制台中让您知道。
如果您正在编写 SQL,那么在将其交给代码执行之前在 SQL Server Management Studio 中对其进行测试总是有用的。
这是正常/预期的吗
您正在使用高级框架 (.net) 进行 Web 开发,因此,调试并不像其他平台(如 PHP 框架)那么简单,除非您对项目依赖项和底层细节/行为有足够的了解。这样,您有时可能会看到不相关或不明确的错误。在我看来,使用高级框架需要更高水平的知识和经验。在您的情况下,主要是仔细检查要故意使用的方法和属性,因为它们可以禁用/干扰您所说的内置异常处理程序行为而不是显示开发人员错误页面,而是显示空白并显示上述错误浏览器控制台
任何打开“更多”调试来识别此类错误的方法 而不是反复试验?HandleError您可以编写一个
方法,其中包含 Handle Errors in ASP.NET Core 中可用的方法之一,以便在您需要的地方使用它,如下所示:
private void HandleError()
{
...
var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
....
}
public void OnGet(string code)
{
//do stuff
HandleError();
//return
}
请阅读整个 MS Doc 页面,找出哪一个最适合您的情况,从而解决主要问题。解决问题后,您就不再需要使用上述技术了。