当在HttpModule中引发异常时,ASP.NET MVC中的自定义错误消息

如何解决当在HttpModule中引发异常时,ASP.NET MVC中的自定义错误消息

|| 我正在使用ASP.NET MVC。我在
BaseController
中的
OnException
上捕获了任何未处理的异常,以正确显示好消息。 但是我在相同的解决方案中有一个Http模块项目。如果用户提出错误请求,模块可能会抛出“ 2”字样。我正在使用IIS7集成模式,并且所有配置都正确。我是IIS生存时间和Http模块异常的新手。 Googling仅找到了使用HttpMethod进行异常处理的方法,这与本例不同。 问题是是否在模块中引发了异常,MVC是否会执行?如果可以,为什么不转到ѭ0?以及如何像在Action方法中那样在MVC中获取异常? 编辑:基于有关应用程序生命周期的答案@nickvane,我尝试更好地解释这种情况。我认为即使是我创造的任何“ 4”也可能引发任何异常。我希望此异常由我的MVC(在ѭ5中)处理。我在想一个: HttpModule的顺序 未处理的异常会停止该模块,并且下一个模块永远不会运行吗? 如果只是在
UrlRoutingModule
之前或之后执行的另一个HttpModule中抛出异常,如何处理MVC Web应用程序(
UrlRoutingModule
)中的异常。 我可以通过使用
context.AllErrors
context.Error
将异常抛出到另一个模块中吗?但是我无法理解错误。 我在地球上发现的唯一方法是从抛出异常更改为ѭ10,但是其他不是我的模块又如何,它仍然抛出异常,我想抓住它。 考虑一下:我创建了MVC Restful API,该API必须返回JSON。我可以使用
OnException
正确处理MVC应用程序中的任何异常,以便任何未处理的异常都将返回诸如{\“ Error \”:\“这里的错误消息。”“之类的东西。现在,我有了HttpModule可能会抛出错误。该模块不关心API和JSON,仅引发异常。然后,我尝试在MVC中捕获此异常,以JSON格式返回。     

解决方法

控制器或httpmodule的生存期非常不同。 此链接显示asp.net应用程序的生命周期: http://msdn.microsoft.com/en-us/library/bb470252.aspx 尽管它不是专门针对asp.net mvc的,但mvc框架会插入此生命周期并遵循以下管道: http://ajaxus.net/wp-content/uploads/2010/01/asp_net_mvc_poster.pdf 从http://www.asp.net/mvc/tutorials/understanding-the-asp-net-mvc-execution-process-vb   对基于ASP.NET MVC的Web的请求   申请首先通过   UrlRoutingModule对象,这是一个   HTTP模块。该模块解析   请求并执行路线选择。   UrlRoutingModule对象选择   匹配的第一个路线对象   当前请求。 (路线对象   是实现RouteBase的类,   通常是   路线类别。)如果没有路线匹配,则   UrlRoutingModule对象什么都不做   并让请求回退到   常规ASP.NET或IIS请求   处理。      在选定的路线对象中,   UrlRoutingModule对象获取   IRouteHandler对象是   与Route对象关联。   通常,在MVC应用程序中   将是   MvcRouteHandler。 IRouteHandler   实例创建一个IHttpHandler   对象并将其传递给IHttpContext   宾语。默认情况下,IHttpHandler   MVC的实例是MvcHandler   宾语。然后,MvcHandler对象   选择将   最终处理请求。 HttpModule插入应用程序生命周期,并且可以在实例化控制器之前或将其释放之后执行代码,具体取决于它在应用程序生命周期中处理的事件。因此,它不能使用控制器的异常处理。 如果您想正确处理httpmodule中的异常,我认为您有2个选择: 捕获异常时,您可以更改请求的响应。您可以插入错误div或将整个响应替换为错误消息,或者仅记录异常。在这种情况下,请求将遵循管道的其余部分。 或者,您可以引发异常并在global.asax Application_Error方法中对其进行处理。在这种情况下,控制器将不会执行。 如果HttpModule抛出一个有效的异常,那么我会选择选项2。您可以抛出自己的自定义异常,并在global.asax中以不同的方式处理它,甚至返回HTTP响应(400错误请求)。 更新资料 如果在HttpModule中引发异常,它将被Application_Error方法捕获。我尝试了以下有效的代码段,尽管感觉不正确:
protected void Application_Error()
    {
        var ex = Server.GetLastError(); // get the last exception that was made
        if (ex == null) return; // if there is no exception,just continue
        Response.ClearContent();
        Response.Write(\"{\'error\':\'\" + ex.Message + \"\'}\");
        Response.ContentType = \"application/json\";
        Response.Flush(); // flush the content to the client
        Response.Close(); // and close the connection so that no other content can be written to the response
        Server.ClearError(); // clear the error so that asp.net does not use the custom error page. If we don\'t close the response and clear the error,the request will still be handled in the rest of the pipeline.
    }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-