首页 新闻 会员 周边

怪异的IIS 500 错误

1
悬赏园豆:40 [已解决问题] 解决于 2014-08-19 11:27

情况是这样,我用了EnterpriseLibrary.ExceptionHandling对MVC中的错误进行拦截处理,处理代码是这样的

这样在本地调试时(也就是IIS Express)是没什么问题,能按照我的预期返回JSON格式的错误消息。但是当我发布到服务器时却会出现500服务器内部错误,但是Response却能正常返回数据(如下图)。我想知道如何修复这一问题,原因是什么。

鲜宏的主页 鲜宏 | 初学一级 | 园豆:132
提问于:2014-08-19 09:41
< >
分享
最佳答案
1

dudu给你的方法是基于你没有拦截异常或者在APP层有异常抛出的情况。

而你的情况是已经在代码中拦截了异常,自然不可以了。

你想知道你的具体错误信息,很简单的。你不是有 handleErrorInfo.Exception 了吗?把这个Exception直接ToString就知道内容了,而不是使用起Message内容。

收获园豆:30
519740105 | 大侠五级 |园豆:5810 | 2014-08-19 10:55

多谢你的回复,发生的Exception是我自己抛出的,所以我知道具体的错误,我的问题是我不知道为什么我处理了这个错误,IIS7.5还是向浏览器发出了500状态码。

鲜宏 | 园豆:132 (初学一级) | 2014-08-19 11:03

@鲜宏: 这个可能是IIS 7.5的处理机制问题了,毕竟你这里确实是导致了500的内部错误,不过你这个错误是抛给了异常处理程序处理,这个处理的本身是属于系统级别的而不是你程序代码级别的。

也就是说,虽然你通过EnterpriseLibary.ExceptionHalding捕获了异常,但是,你还是对这个异常执行了输出:exceptionContext.Result = json,此时,在IIS级别,看到的还是有异常抛出,只是这个抛出的异常经过了再次处理而已。

至于为什么IIS Express没有抛出500异常,这个就不得而知了,需要更进一步的研究。

而解决你这个问题的办法,我想,你可以在异常捕获后,处理好自己的错误输出信息的同时,强制的把状态修改为200或通过其它的方案消除异常(比如把handleErrorInfo.Exception置为null之类的)。

519740105 | 园豆:5810 (大侠五级) | 2014-08-19 11:12

@519740105: 我的思路跟你也类似,最终通过 exceptionContext.HttpContext.Response.StatusCode = 200;这样搞定,多谢你的回复。

鲜宏 | 园豆:132 (初学一级) | 2014-08-19 11:24

@鲜宏: 不客气,问题解决就好。

519740105 | 园豆:5810 (大侠五级) | 2014-08-19 11:25
其他回答(1)
0

在Global.asax.cs中加上下面的代码,你就可以知道500错误的具体信息:

protected void Application_Error(object sender, EventArgs e)
{
    var lastError = Server.GetLastError();

    if (lastError != null)
    {
        //将异常信息写入日志
    }
}
收获园豆:10
dudu | 园豆:31003 (高人七级) | 2014-08-19 09:51

好,我试试。多谢dudu

支持(0) 反对(0) 鲜宏 | 园豆:132 (初学一级) | 2014-08-19 10:09

我试过了,Application_Error 这个方法不会被执行,我想错误应该是已经被处理了,不然我的JSON也不会被返回,就是数据正常返回的同时却引发了500错误。而IIS Express却不会这样。

支持(0) 反对(0) 鲜宏 | 园豆:132 (初学一级) | 2014-08-19 10:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册