我正在尝试为我的MVC项目找到理想的异常处理策略。我已经完成了以下工作,正在寻找一些反馈。
问题:
我有不同的结果类型(页面,部分页面,JSON,文件等)。 Controller.OnException()
没有简单的方法来确定客户期望的结果类型。没有什么特别的东西,当他们想要JSON等时,我正在提供HTML页面,这会导致显示问题。
解决方案:
我有一个抽象BaseController
,其中包含HandleJsonException()
,HandlePartialPageException()
,HandlePageException()
等实用函数。这些函数将:
a)切换到Enterprise Library以进行日志记录和通知。
b)以客户期望的格式设置结果视图。
c)为错误设置适当的Http状态代码。
我根据结果类型将操作分成不同的控制器。例如,我没有AbcController
而是AbcPageController
和AbcJsonController
。此控制器的OnException调用其中一个基类实用程序处理程序。
JavaScript(针对JSON和部分页面视图)查看状态代码以指导行为。
我关注的是显示逻辑正在指示控制器的设计,因此影响路由(不是URL,而是路由显然)。此外,这对于基本控制器上共享OnAuthenticate的先前继承策略有所不足。
无论如何......正在寻找评论。并且可能链接到其他人解决这个问题的方法。
干杯
答案 0 :(得分:1)
Controller.OnException()没有简单的方法来确定客户期望的结果类型
您可以使用标准尊重客户端发送的Accept
请求标头来指示它们支持和期望的内容类型。例如,如果您使用jquery.getJSON()
方法,则会发送以下标头:Accept: application/json, text/javascript, */*
。正如您所看到的,application/json
是首选格式,您可以在控制器中使用此信息。
答案 1 :(得分:0)
我最终放弃了这种方法。
处理错误将直接从控制器操作返回适当的结果。
Controller.OnException中处理的未处理错误将:
a)将HttpStatusCode设置为500。 b)使用我们的应用程序错误页面呈现完整的HTML页面 c)将processed属性设置为true,因此自定义错误页面不会启动。
如果调用者期望HTML页面以外的其他内容(Ajax JSON,Partial Page,XML等)将检查500代码并忽略HTML内容。