为什么在 asp.net 5 razor 页面中没有开发人员异常页面?

问题描述

我有一个简单的 asp.net 5 razor pages 应用程序,它不显示开发人员异常页面,但在浏览器开发人员工具中显示了这一点

The character encoding of the plain text document was not declared. The document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range. The character encoding of the file needs to be declared in the transfer protocol or file needs to use a byte order mark as an encoding signature.

经过多次迭代和调试,结果发现 sql 查询中存在一个简单的错字,并没有显示开发人员错误页面,而是在浏览器控制台中显示为空白并显示上述错误!

问题 -

  • 这是正常的/预期的吗?
  • 有没有办法打开“更多”调试来识别此类错误,而不是反复试验?

环境-

  • Visual Studio 2019,.net 5
  • 使用 dapper v2.0.78 访问数据库
  • 配置下面的摘录!
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 不会被执行时找出错误的方法!!

在 GetEmployees 中

        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;
            }

        }

解决方法

如果您的服务器端代码出现异常,将显示开发者错误页面。根据控制台消息,您的 SQL 错字很可能没有导致引发异常。或者,如果确实如此,您可能会将其隐藏在 try - catch 块中。您实际上还没有显示相关代码,所以这纯粹是推测。无论哪种方式,它都会导致您的视图页面尝试呈现浏览器无法理解的内容,因此浏览器会在控制台中通知您。

如果您正在编写 SQL,在将其交给您的代码执行之前,在 SQL Server Management Studio 中对其进行测试总是很有用的。

,

这是正常的/预期的

您正在使用用于 Web 开发的高级框架 (.net),因此,除非您对该项目有足够的了解,否则调试不像其他平台(如 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 页面,以找出哪一个最适合您的情况以解决主要问题。清除问题后,您无需再使用上述技术。

,

通常在这些情况下,第一种方法应该是尝试在小型/干净的项目中重现行为,以便您可以排除各种情况。

如您所见,就您而言

 services.AddDatabaseDeveloperPageExceptionFilter()

这是导致问题的原因。 作为Microsoft says in the documentation

这应该只在开发环境中启用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...