我在Content-type标头中使用application/json
的请求调用了一个操作。这些请求将自动创建一个JsonValueProvider,尝试反序列化请求的内容。当json格式错误时,值提供程序将抛出异常,从而导致应用程序的错误页面。
要重现此行为,只需将无效的json数据POST到发送application/json
作为Content-type标头的操作。这将触发异常。
[编辑]
不需要太多代码。只需创建一个空控制器方法,并使用Firefox“Poster”之类的工具向操作发送无效请求。
public class HomeController
{
public ActionResult Index()
{
return this.Json(true);
}
}
然后使用Poster:
application/json
{"This is invalid JSON:,}
结果将是完整的标准ASP.NET HTML错误页面(通用或自定义,具体取决于您的应用程序)。
[/编辑]
由于嵌入式设备调用了我的操作,因此我想发送简短的响应,而不是HTML错误页面。我希望能够使用状态代码500,内容类型:text/plain
创建响应,并将异常消息作为内容创建。
我已经尝试过自定义模型绑定器和自定义错误处理程序属性,但是由于异常发生在处理管道中的早期,因此都没有调用。有没有办法处理这个错误?
作为一种解决方法,我目前已为整个应用程序禁用了JsonValueProvider,并自己从请求体中加载值。如果有一种方法可以基于每个操作禁用JsonValueProvider,这也会有所帮助。
提前感谢任何指针!
答案 0 :(得分:0)
您可以订阅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);
}