症状:本地开发没有问题,页面能正常打开,但是一发布,就报错.
![](https://img.haomeiwen.com/i3846025/3825b7b7baaded3c.png)
根据提示,在Web.config中加了<customErrors mode="Off"/>
如图:
![](https://img.haomeiwen.com/i3846025/cb81e4062ea7034d.png)
再刷新下页面:
![](https://img.haomeiwen.com/i3846025/7f7d441a50427a80.png)
至少错误提示变化了
查看自己项目里面确实少了文件夹"Shared",就新建了一个空的MVC项目,把Views文件夹里的"Shared"文件夹连同文件一次copy了过来,
再刷新
![](https://img.haomeiwen.com/i3846025/04a70aab9f3bd7e7.png)
有点失望呢,这么简单的提示吗?
于是打开Error.cshtml看看里面的代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width" />
<title>错误</title>
</head>
<body>
<hgroup>
<h1>错误。</h1>
<h2>处理你的请求时出错。</h2>
</hgroup>
</body>
</html>
就只有13行,以前没有打开过,今天才注意到.但是为什么不是下面这种错误?能告诉我是哪一行的那种提示.
![](https://img.haomeiwen.com/i3846025/fd33c6029df247b0.png)
这是我故意写的异常.但是为什么demo项目没有简单得显示"处理你的请求时出错。"?这里有猫腻!
突然想到 App_Start/FilterConfig.cs里面被我重写过
于是去看下demo项目里的代码.默认是
using System.Web;
using System.Web.Mvc;
namespace WebApplication1
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
}
简直不能更简单.
就是这个"HandleErrorAttribute"显示出了具体的出错行号.
看我项目里的这个文件
using LS365.ModelBase;
using System.Web;
using System.Web.Mvc;
namespace LS365.Admin
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// filters.Add(new HandleErrorAttribute());
filters.Add(new ExceptionFilterAttribute());
}
}
public class ExceptionFilterAttribute : HandleErrorAttribute
{
/// <summary>
/// 在异常发生时调用
/// </summary>
/// <param name="filterContext"></param>
public override void OnException(ExceptionContext filterContext)
{
// 判断是否已经处理过异常
if (!filterContext.ExceptionHandled)
{
// 获取出现异常的controller和action名称,用于记录
string strControllerName = filterContext.RouteData.Values["controller"].ToString();
string strActionName = filterContext.RouteData.Values["action"].ToString();
// 定义一个HandleErrorInfo,用于Error视图展示异常信息
HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, strControllerName, strActionName);
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
BaseResultModel error = new BaseResultModel();
error.Data = info;
error.Msg = "服务器发生错误:" + info.Exception.Message;
filterContext.Result = new JsonNetResult() { Data= error };
}
else
{
ViewResult result = new ViewResult
{
ViewName = this.View,
// 定义ViewData,泛型
ViewData = new ViewDataDictionary<HandleErrorInfo>(info)
};
// 设置操作结果
filterContext.Result = result;
}
// 设置已经处理过异常
filterContext.ExceptionHandled = true;
}
//base.OnException(filterContext);
}
}
}
重点解释一下
"filterContext.ExceptionHandled = true;"这句是告诉MVC 框架异常已经被处理过了,它就不会再进行默认(显示出报错的行号)的处理;
//base.OnException(filterContext);当filterContext.ExceptionHandled = =false的时候,让MVC框架进行默认处理的代码
所以,这里的逻辑不再符合当前项目的业务了.经过改造后变成了
using LS365.ModelBase;
using System.Web;
using System.Web.Mvc;
namespace LS365.Admin
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// filters.Add(new HandleErrorAttribute());
filters.Add(new ExceptionFilterAttribute());
}
}
public class ExceptionFilterAttribute : HandleErrorAttribute
{
/// <summary>
/// 在异常发生时调用
/// </summary>
/// <param name="filterContext"></param>
public override void OnException(ExceptionContext filterContext)
{
// 判断是否已经处理过异常
if (!filterContext.ExceptionHandled)
{
// 获取出现异常的controller和action名称,用于记录
string strControllerName = filterContext.RouteData.Values["controller"].ToString();
string strActionName = filterContext.RouteData.Values["action"].ToString();
// 定义一个HandleErrorInfo,用于Error视图展示异常信息
HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, strControllerName, strActionName);
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
// 在异步请求中设置已经处理过异常
filterContext.ExceptionHandled = true;
BaseResultModel error = new BaseResultModel();
error.Data = info;
error.Msg = "服务器发生错误:" + info.Exception.Message;
filterContext.Result = new JsonNetResult() { Data= error };
}
else
{
ViewResult result = new ViewResult
{
ViewName = this.View,
// 定义ViewData,泛型
ViewData = new ViewDataDictionary<HandleErrorInfo>(info)
};
// 设置操作结果
filterContext.Result = result;
//get请求打开页面时,继续使用mvc自带的错误提示页
base.OnException(filterContext);
}
}
}
}
}
编译后,再发布一次,刷新
![](https://img.haomeiwen.com/i3846025/82d16bbbdbc07e53.png)
终于看到了具体的行号
提示"include"文件夹中没有"loading.cshtml"文件,去服务器上看一下,还真没有.但是开发的机器上是有的,为什么在发布了之后,就没有了呢?过了一会儿,才反应过来.原来它没有位于Views文件夹中,那就转移过来试试,为了保险起见,新建了一个IncludeController,加了一个Action "loading",才添加的视图.
再编译,发布一次,成功了.
网友评论