癥狀:本地開發(fā)沒有問題,頁面能正常打開,但是一發(fā)布,就報錯.

根據(jù)提示,在Web.config中加了<customErrors mode="Off"/>
如圖:

再刷新下頁面:

至少錯誤提示變化了
查看自己項目里面確實少了文件夾"Shared",就新建了一個空的MVC項目,把Views文件夾里的"Shared"文件夾連同文件一次copy了過來,
再刷新

有點失望呢,這么簡單的提示嗎?
于是打開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行,以前沒有打開過,今天才注意到.但是為什么不是下面這種錯誤?能告訴我是哪一行的那種提示.

這是我故意寫的異常.但是為什么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>
/// 在異常發(fā)生時調用
/// </summary>
/// <param name="filterContext"></param>
public override void OnException(ExceptionContext filterContext)
{
// 判斷是否已經(jīng)處理過異常
if (!filterContext.ExceptionHandled)
{
// 獲取出現(xiàn)異常的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 = "服務器發(fā)生錯誤:" + 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;
}
// 設置已經(jīng)處理過異常
filterContext.ExceptionHandled = true;
}
//base.OnException(filterContext);
}
}
}
重點解釋一下
"filterContext.ExceptionHandled = true;"這句是告訴MVC 框架異常已經(jīng)被處理過了,它就不會再進行默認(顯示出報錯的行號)的處理;
//base.OnException(filterContext);當filterContext.ExceptionHandled = =false的時候,讓MVC框架進行默認處理的代碼
所以,這里的邏輯不再符合當前項目的業(yè)務了.經(jīng)過改造后變成了
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>
/// 在異常發(fā)生時調用
/// </summary>
/// <param name="filterContext"></param>
public override void OnException(ExceptionContext filterContext)
{
// 判斷是否已經(jīng)處理過異常
if (!filterContext.ExceptionHandled)
{
// 獲取出現(xiàn)異常的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())
{
// 在異步請求中設置已經(jīng)處理過異常
filterContext.ExceptionHandled = true;
BaseResultModel error = new BaseResultModel();
error.Data = info;
error.Msg = "服務器發(fā)生錯誤:" + 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請求打開頁面時,繼續(xù)使用mvc自帶的錯誤提示頁
base.OnException(filterContext);
}
}
}
}
}
編譯后,再發(fā)布一次,刷新

終于看到了具體的行號
提示"include"文件夾中沒有"loading.cshtml"文件,去服務器上看一下,還真沒有.但是開發(fā)的機器上是有的,為什么在發(fā)布了之后,就沒有了呢?過了一會兒,才反應過來.原來它沒有位于Views文件夾中,那就轉移過來試試,為了保險起見,新建了一個IncludeController,加了一個Action "loading",才添加的視圖.
再編譯,發(fā)布一次,成功了.