情况是这样,我用了EnterpriseLibrary.ExceptionHandling对MVC中的错误进行拦截处理,处理代码是这样的
这样在本地调试时(也就是IIS Express)是没什么问题,能按照我的预期返回JSON格式的错误消息。但是当我发布到服务器时却会出现500服务器内部错误,但是Response却能正常返回数据(如下图)。我想知道如何修复这一问题,原因是什么。
dudu给你的方法是基于你没有拦截异常或者在APP层有异常抛出的情况。
而你的情况是已经在代码中拦截了异常,自然不可以了。
你想知道你的具体错误信息,很简单的。你不是有 handleErrorInfo.Exception 了吗?把这个Exception直接ToString就知道内容了,而不是使用起Message内容。
多谢你的回复,发生的Exception是我自己抛出的,所以我知道具体的错误,我的问题是我不知道为什么我处理了这个错误,IIS7.5还是向浏览器发出了500状态码。
@鲜宏: 这个可能是IIS 7.5的处理机制问题了,毕竟你这里确实是导致了500的内部错误,不过你这个错误是抛给了异常处理程序处理,这个处理的本身是属于系统级别的而不是你程序代码级别的。
也就是说,虽然你通过EnterpriseLibary.ExceptionHalding捕获了异常,但是,你还是对这个异常执行了输出:exceptionContext.Result = json,此时,在IIS级别,看到的还是有异常抛出,只是这个抛出的异常经过了再次处理而已。
至于为什么IIS Express没有抛出500异常,这个就不得而知了,需要更进一步的研究。
而解决你这个问题的办法,我想,你可以在异常捕获后,处理好自己的错误输出信息的同时,强制的把状态修改为200或通过其它的方案消除异常(比如把handleErrorInfo.Exception置为null之类的)。
@519740105: 我的思路跟你也类似,最终通过 exceptionContext.HttpContext.Response.StatusCode = 200;这样搞定,多谢你的回复。
@鲜宏: 不客气,问题解决就好。
在Global.asax.cs中加上下面的代码,你就可以知道500错误的具体信息:
protected void Application_Error(object sender, EventArgs e) { var lastError = Server.GetLastError(); if (lastError != null) { //将异常信息写入日志 } }
好,我试试。多谢dudu
我试过了,Application_Error 这个方法不会被执行,我想错误应该是已经被处理了,不然我的JSON也不会被返回,就是数据正常返回的同时却引发了500错误。而IIS Express却不会这样。