ASP.NET Core无法将ViewResult转为ContentResult异常原因
异常根因
你遇到的是典型的类型不匹配强转异常:
代码中直接将filterContext.Result强制转换为ContentResult,默认假设所有被这个ActionFilter拦截的接口返回值都是ContentResult类型,但实际触发异常的请求对应的Action返回的是ViewResult(即MVC中返回Razor视图的结果类型)。ViewResult和ContentResult都是IActionResult接口的平级实现,互相没有继承关系,无法直接强制转换,因此抛出异常。
需要注意:如果你的ActionFilter注册在全局或者控制器级别,它会拦截作用域内所有Action的请求,而不同Action完全可能返回不同类型的结果:除了ContentResult、ViewResult,常见的还有JsonResult、RedirectResult、NotFoundResult、FileResult等,直接硬编码强转为单一类型,只要遇到其他返回类型就会触发同类异常。教程中的演示场景通常会特意让被拦截的Action返回ContentResult,你实际运行时过滤器覆盖到了返回视图的Action,就触发了这个问题。
修复方式
去掉直接强转的写法,先做类型兼容性判断,只有结果是目标类型时再执行对应日志逻辑即可:
public override void OnResultExecuted(ResultExecutedContext filterContext) { // 仅当返回结果是ContentResult时执行日志写入 if (filterContext.Result is ContentResult contentResult) { using (FileStream fs = new FileStream("c:\\logs\\log.txt", FileMode.Append)) { using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine("Résultat: " + contentResult.Content); } } } // 如需记录其他类型返回结果的日志,可在此追加对应类型的判断分支 }
如果这个过滤器本身设计上就只需要处理返回ContentResult的接口,建议通过特性标记的方式限定过滤器的作用范围,避免拦截非目标接口。
内容的提问来源于stack exchange,提问作者Dotnet_Developer10
相关产品推荐
相关产品推荐

