Asp.net mvc 不同结果类型的MVC Controller.OneException

Asp.net mvc 不同结果类型的MVC Controller.OneException,asp.net-mvc,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 2,我试图为我的MVC项目找到理想的异常处理策略。我已经做了以下工作,希望得到一些反馈 问题: 我有不同的结果类型(页面、部分页面、JSON、文件等)Controller.OnException()没有一种简单的方法来识别客户端期望的结果。如果他们需要JSON等等,我会提供一个HTML页面,这会导致显示问题 解决方案: 我有一个抽象的BaseController,它有一些实用功能,如handlejsoneexception(),handlepartialpage exception(),handle

我试图为我的MVC项目找到理想的异常处理策略。我已经做了以下工作,希望得到一些反馈

问题:

我有不同的结果类型(页面、部分页面、JSON、文件等)
Controller.OnException()
没有一种简单的方法来识别客户端期望的结果。如果他们需要JSON等等,我会提供一个HTML页面,这会导致显示问题

解决方案:

  • 我有一个抽象的
    BaseController
    ,它有一些实用功能,如
    handlejsoneexception()
    handlepartialpage exception()
    handlepage exception()
    ,等等。这些功能将:

    a) 移交给企业库进行日志记录和通知

    b) 以客户端期望的格式设置结果视图

    c) 为错误设置适当的Http状态代码

  • 我根据结果类型将操作分为不同的控制器。例如,我没有使用
    AbcController
    而是使用
    AbcPageController
    AbcJsonController
    。此控制器的OneException调用基类实用程序处理程序之一

  • JavaScript(用于JSON和部分页面视图)查看状态代码,在某些情况下指导行为

  • 我关心的是,显示逻辑决定了控制器的设计,因此影响了路由(不是URL,而是路由)。此外,这会干扰先前关于基本控制器上共享OnAuthenticate的继承策略

    无论如何。。。正在寻找评论。并且可能与其他人解决这个问题的方法有关

    干杯

    Controller.OnException()并没有一种简单的方法来识别客户端期望的结果类型


    您可以使用尊重标准的客户机发送的
    Accept
    请求头来指示他们支持什么内容类型,并期望得到什么样的回报。例如,如果您正在使用该方法,它将发送以下标题:
    Accept:application/json,text/javascript,*/*
    。如您所见,这里首选的格式是
    application/json
    ,您可以在控制器中使用这些信息。

    我最终放弃了这种方法

    已处理的错误将直接从控制器操作返回适当的结果

    Controller.OneException中处理的未处理错误将:

    a) 将HttpStatusCode设置为500。 b) 使用我们的应用程序错误页面呈现完整的HTML页面 c) 将handled属性设置为true,这样自定义错误页就不会生效


    如果调用方需要的不是HTML页面(Ajax JSON、部分页面、XML等),则将检查500代码并忽略HTML内容。

    谢谢Darin。这看起来很有希望,我可能会走这条路。它适用于JSON,但对于text/html(或/),我无法区分需要html页面的客户端和需要PartialView html片段的客户端。