为啥 asp.net 5 剃须刀页面中没有开发人员异常页面?

Posted

技术标签:

【中文标题】为啥 asp.net 5 剃须刀页面中没有开发人员异常页面?【英文标题】:Why no developer exception page in asp.net 5 razor pages?为什么 asp.net 5 剃须刀页面中没有开发人员异常页面? 【发布时间】:2021-05-27 08:57:30 【问题描述】:

我有一个简单的 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 可以正确呈现的动机? 你能在一个新的、干净的项目上重现这个吗? @GeorgeVovos 感谢您的提示,原来是 services.AddDatabaseDeveloperPageExceptionFilter();是问题所在,仍处于开发的早期阶段,但将其取出有效!再次感谢! @GeorgeVovos 我认为如果您可以将其作为答案发布,赏金应该交给您 为了得到几分而发布别人的答案感觉很愚蠢......我会无耻地这样做:) 【参考方案1】:

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

如您所见,在您的情况下是

 services.AddDatabaseDeveloperPageExceptionFilter()

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

这只能在开发环境中启用。

【讨论】:

【参考方案2】:

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

如果您正在编写 SQL,最好先在 SQL Server Management Studio 中对其进行测试,然后再将其交给您的代码执行。

【讨论】:

如果有一个 try/catch 处理程序,那么页面上将会有一些来自菜单等的内容,而不是控制台中带有该文本的空白页面!但我已经更新了上面的问题【参考方案3】:

这是正常/预期的

您正在使用用于 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 页面,以找出最适合您的情况以解决主要问题。清除问题后,您不再需要使用上述技术。

【讨论】:

以上是关于为啥 asp.net 5 剃须刀页面中没有开发人员异常页面?的主要内容,如果未能解决你的问题,请参考以下文章

在 asp .net mvc 5 中预编译剃须刀视图

ASP.net 剃须刀页面和多选,在选择中发布所有项目

路由覆盖在 asp.net core 3.1 剃须刀页面中不起作用

ASP.net core 3.1 中控制器和剃须刀页面之间的路由

剃须刀页面上自定义验证属性的 ASP.NET Core 客户端验证

ASP .NET Core Razor 页面中的授权