我試圖實現自定義的錯誤在我的asp.net mvc的5應用程序處理,使用相同的技術,我一直使用:MVC 5自定義錯誤頁中使用Autofac
protected void Application_Error(object sender, EventArgs e)
{
try
{
HandleApplicationErrors();
Response.TrySkipIisCustomErrors = true;
}
catch(Exception ex)
{
Response.Write(ex.ToString());
Response.StatusCode = 500;
}
}
private void HandleApplicationErrors(int? statusCode = null)
{
try
{
Exception ex = Server.GetLastError();
Response.Clear();
HttpException httpEx = ex as HttpException;
if (statusCode == null && httpEx != null) statusCode = httpEx.GetHttpCode();
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
switch (statusCode)
{
case 404:
routeData.Values.Add("action", "NotFound");
break;
case 403:
routeData.Values.Add("action", "Forbidden");
break;
default:
routeData.Values.Add("action", "ServerError");
break;
}
routeData.Values.Add("exception", ex);
Server.ClearError();
this.Server.ClearError();
this.Response.TrySkipIisCustomErrors = true;
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(this.Context), routeData));
}
catch(Exception ex)
{
Response.Write(ex.ToString());
Response.StatusCode = 500;
}
}
這工作就好了在過去,但是在這個應用程序中,我使用的是Autofac,而且它正在拋出「實例無法解析,並且嵌套的生命週期無法在此LifetimeScope中創建,因爲它已經處理完畢。」在controller.Execute線上。我已經嘗試從autofac註冊中排除ErrorController(它不具有和構造函數參數)並直接構造它。
控制器代碼非常簡單:
private CustomErrorModel GetModel(Exception ex)
{
var model = new CustomErrorModel();
model.RequestedUrl = Request.Url.OriginalString;
model.ReferrerUrl = (Request.UrlReferrer == null || model.RequestedUrl == Request.UrlReferrer.OriginalString) ? null : Request.UrlReferrer.OriginalString;
model.Exception = ex;
return model;
}
public ActionResult ServerError(Exception ex)
{
var model = GetModel(ex);
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
Response.Status = "500 Internal Server Error";
return View(model);
}
任何人有使這項工作任何想法?
錯誤控制器的構造函數呢?有一個嗎?我正在做與你完全一樣的事情(包括使用Autofac)並且沒有任何問題。 –
錯誤控制器沒有構造函數。這一切在不使用autofac時都有效。順便說一句,我也嘗試了一個空的默認構造函數。 –
實際上,我認爲你的問題是你的控制器中的'ServerError'動作將參數定義爲'ex',但是在'HandleApplicationErrors'中,你將它的路由參數設置爲'exception'。更改以使它們匹配,並且它會按預期工作。 –