【问题标题】:ASP.NET MVC 4: Handle exception caused by JsonValueProviderASP.NET MVC 4:处理由 JsonValueProvider 引起的异常
【发布时间】:2013-05-31 00:01:34
【问题描述】:

我有一个在 Content-type 标头中使用带有 application/json 的请求调用的操作。这些请求将自动创建一个尝试反序列化请求内容的 JsonValueProvider。当json格式错误时,value provider会抛出异常,导致应用的错误页面。

要重现此行为,只需将无效的 json 数据发布到发送 application/json 作为 Content-type 标头的操作。这将触发异常。

[编辑]

不需要太多代码。只需创建一个空的控制器方法并使用 Firefox“Poster”之类的工具向操作发送无效请求。

public class HomeController
{
    public ActionResult Index()
    {
        return this.Json(true);
    }
}

然后使用海报:

  • 将内容类型设置为application/json
  • 将请求内容设置为{"This is invalid JSON:,}
  • 发送请求

结果将是完整的标准 ASP.NET HTML 错误页面(通用或自定义,取决于您的应用程序)。

[/编辑]

由于嵌入式设备调用了我的操作,我想发送简短的响应,而不是 HTML 错误页面。我希望能够创建状态码为 500、内容类型:text/plain 的响应以及异常消息的内容。

我已经尝试了自定义模型绑定器和自定义错误处理程序属性,但由于异常发生在处理管道中的早期,因此两者都没有被调用。有没有办法处理这个错误?

作为一种解决方法,我目前已为整个应用程序禁用 JsonValueProvider 并自己从请求正文中加载值。如果有办法在每个操作的基础上禁用 JsonValueProvider,这也会有所帮助。

提前感谢您的任何指点!

【问题讨论】:

  • 你能从你的代码中发布一些示例吗?

标签: asp.net-mvc json exception asp.net-mvc-4 error-handling


【解决方案1】:

您可以在 Global.asax 中订阅 Application_Error 事件并根据需要处理异常:

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    Response.TrySkipIisCustomErrors = true;
    Response.Clear();
    Server.ClearError();
    Response.StatusCode = 500;
    Response.ContentType = "text/plain";
    Response.Write("An error occured while processing your request. Details: " + exception.Message);
}

【讨论】:

  • 是的,这是一个有效的选项,但不限于特定的操作。该应用程序既包含一个真实的 Web 应用程序,也包含一个用于嵌入式设备的 API 部分。一般例外页面应该到位。我只希望它针对特定的 MVC 操作进行定制。
  • 当然,在异常处理程序中测试哪个是当前控制器和操作非常简单。一旦你知道你可以只对那些请求执行异常处理。
  • 真的那么小众吗?在错误事件处理程序中,我没有 MVC RouteValues,或者我没有?我不想让它依赖于 URL,因为路由可能会发生变化,我不想总是记住在全局错误处理程序中调整模式匹配。
  • 是的,从当前上下文中获取 RouteData 绝对是微不足道的:var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));。然后只需询问当前控制器:routeData.GetRequiredString("controller")。如果您愿意,也可以选择当前操作:routeData.GetRequiredString("action").
  • 我不知道!谢谢!我已将您的答案标记为已接受。我仍然想知道,是否可以在每个方法的基础上禁用 JsonValueProvider,因为它会引发一个相对通用的异常(我相信 InvalidOperationException),这也可能发生在不同的操作上并且可能需要不同的处理方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2011-10-20
  • 2012-05-04
  • 2012-09-17
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多