2

我在调试。在 ASP.net MVC 4 Web 应用程序上。

应用程序中有许多 JsonResult 控制器操作。如果发生错误,系统会返回错误文本和带有 HTML 标记的堆栈跟踪。当错误发生在 ViewResult Controller Action 上时,这很方便,但是很难阅读 JsonResult Controller Actions 的错误消息,因为我通常会在调试器中看到错误消息的文本,如果有的话。

有没有一种实用的方法可以让 JsonResult 控制器操作以纯文本形式将其错误消息返回给浏览器?

4

2 回答 2

0

有几种处理方法,但我怀疑最容易开始工作的是捕获异常并在您的操作上下文中处理它们:

public ActionResult Index()
{
    try
    {
        // Your code which may throw an exception.
    }
    catch(Exception ex)
    {
        return ex.ToJsonResult();
    }
}

您可以轻松地创建一个扩展方法,以您喜欢的任何方式执行异常转换。

internal static ExceptionHelper
{
    public static JsonResult ToJsonResult(this Exception ex)
    {
        // TODO: build and return the JsonResult from the exception informtation.
    }
}

虽然以全局方式处理这个问题会很好,但是如果不以某种可以通过反射达到的方式更改其签名,就很难知道您的操作的结果应该是什么。

于 2012-12-13T17:27:35.310 回答
0

一个有点复杂的解决方案是创建一个自定义HandleErrorsAttribute实现,然后您可以将其添加到单个操作、整个控制器或注册到您的全局过滤器集合中,以这种方式处理所有请求。这是 MVC 中用于自定义异常处理的扩展点。

您的实现可能非常简单,如下所示:

public class HandleErrorsAsJsonAttribute : HandleErrorsAttribute
{
    public HandleErrorsAsJsonAttribute()
    {
    }

    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled)
        {
            return;
        }

        var ex = filterContext.Exception

        // TODO: build the JsonResult from the exception information.
        filterContext.Result = new JsonResult();

        // Indicate the exception is handled 
        // to prevent it being passed to other filters.
        filterContext.ExceptionHandled = true;
    }
}

在这种情况下,您可以将其仅应用于您希望将信息作为 JSON 对象返回的操作或控制器。如果您的所有控制器都返回 JSON,那么您只需将属性添加到全局集合并完成它即可。

于 2012-12-17T10:15:43.437 回答